采用双指针法。
双指针法容易出错的地方在于确定好两个指针的作用,用来保存的指针不要包含未经判定的元素
- 1、想明白两个指针的作用是什么。刚开始写时让两个指针都去检测是否等于val,判定语句比较多,还容易导致跳过某些元素。其实实际上只要确定:由左指针来保证它经过的元素都是不等于val的元素,右指针来保证对整个序列进行检测,保证不遗漏。
- 2、因此,当右指针检测到等于val的值时,马上right+1;当检测到不等于val的值时,马上保存到左指针位置
代码如下
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size()-1;
int left = 0;
int right = 0;
//右指针检测完这个序列后结束循环
while(right<=n){
if(nums[right] == val){
right++;
}
else{
//每当检测到不等于val的值时立刻交换。确保left中的值都是不等于val的值。
//因为最开始left和right的位置是相同的,如果是一个不等于val的数原地交换不会改变结果,一旦出现一个不等于val的数right指针将一直在left指针前
nums[left] = nums[right];
left++;
right++;
}
}
return left;//left不包含未经判定的元素,只有确定有不等于val的元素left才会移动,因此直接返回
}
};
标签:right,val,int,检测,元素,移除,指针
From: https://www.cnblogs.com/gqzz/p/18453165