力扣 题目27-- 移除元素
题目
题解
双指针
int left = 0; int right = nums.size()-1;
一开始
每次循环先从左边开始
for (; left < nums.size(); left++){}
先在右指针判断是否为Val 如果是Val 我们肯定就不能把这个值再给左指针了那就往左走
右指针做完了看左指针 应该是相反操作即只有和val一样的才会停留 然后将右指针的值给左指针 然后右指针向左走 左指针向右走
此时出现 如图 继续重复上面赋值操作
左右指针相等时返回left+1即可(因为left是0开始)
这样确实简单明了 但是有一些特殊情况需要考虑
1. 如下图所展示 这样left+1 right-1 就无法到达==的情况以此需要在right-1后加一个额外的判断
2.如下图所展示 如果最后的位置是2那么就应该返回left而不是left+1了
代码
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 int removeElement(vector<int>& nums, int val) { 7 int left = 0; 8 int right = nums.size()-1; 9 for (; left < nums.size(); left++) { 10 while (right>0&&right > left && nums[right] == val) { 11 right = right - 1; 12 } 13 if (left == right&& nums [left] != val) { 14 return left + 1; 15 } 16 else if(left == right && nums[left] == val) 17 { 18 return left; 19 } 20 if (nums[left]==val) { 21 nums[left] = nums[right]; 22 right = right - 1; 23 if (left == right) { 24 return left + 1; 25 } 26 } 27 } 28 return 0; 29 } 30 }; 31 32 int main() { 33 Solution sol; 34 vector<int> nums={ 1,2,1}; 35 int num=sol.removeElement(nums,3); 36 for (int i = 0; i < num; i++) { 37 cout << nums[i] << endl; 38 } 39 40 41 }