力扣 题目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 }
View Code

 

posted @ 2022-04-15 12:28  无聊的阿库娅  阅读(26)  评论(0编辑  收藏  举报