LeetCode 27:移除元素
解答:双指针
解法一:快慢指针
在最坏情况下(输入数组中没有元素等于val),左右指针各遍历了数组一次。但不会改变相对位置。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int left = 0;
for (int right = 0; right < n; right++) {
if (nums[right] != val) {
//把右边快指针的值复制到左边慢指针的位置,nums[right]==val就continue
nums[left++] = nums[right];
}
}
return left;
}
};
解法二:左右指针
在最坏的情况下合起来只遍历了数组一次。减少了复制次数。但是改变了相对位置。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left=0, right=nums.size()-1;
while(left <= right){
if(nums[left] == val){
//用右指针的元素覆盖掉左指针的元素,右指针向中间移动
nums[left] = nums[right];
right--;
}
else{
//左指针向中间移动
left++;
}
}
return left;
}
};