双指针
双指针是出现常用的一种解题方法。两个指针就像兄弟一般完美配合,不论是左右指针还是快慢指针,都可以达到非常好的效果。
数组下的双指针
对于数组来说,在要求对重复元素移除等需要原地移除(也就是在原数组身上做改变,而不新建数组)
移除元素多种写法
先来看一道简单题:
原地移除所有数值等于val的元素。
这时我们就可以定义两个指针,一个快指针一个慢指针。
快指针,就是一直向前走的那一个。而慢指针则是遇到需要处理的情况才动身的那一个。
比如[0,1,2,2,3],val=2
快指针fast先判断,如果当前指向的元素不是val,那么把这个值给慢指针slow,然后fast走一步,slow走一步。
是val那么slow就不走。(这样做是为了跳过val,同时又能把val之后的值覆盖到val的位置)
我们先用最通俗的写法:
int removeElement(vector<int>& nums, int val) {
int slow=0,fast=0;
while(fast!=nums.size()){
if(nums[fast]!=val){
nums[slow]=nums[fast];
fast++;
slow++;
}
else
fast++;
}
return slow;
}
说一下返回值为什么是slow。最后要求返回长度,看上去slow是从0开始的,应该+1。但实际上我们在最后判断时让slow++了,所以就不用+1了。
这里可以进一步简化为:
int removeElement(vector<int>& nums, int val) {
int slow=0,fast=0;
while(fast!=nums.size()){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
当然我们也可以把fast写到for循环里:
for(fast=0;fast<nums.size();fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
删除排序数组的重复值
这也是一道双指针问题,只是需要多思考一下赋值的过程