题目
①双指针解决本题的思路
1.明确双指针slow、fast的作用:
1_1.slow:
数组该更新的位置,
“新数组”(最终数组)的个数。
注意:本题新数组可以不需要辅助空间,而下一篇文章(有序数组的平方,就需要辅助数组)
1_2.fast:
遍历原数组(初始数组)
2.双指针工作原理:(T是我们要删除的元素)
fast用于遍历原数组,结果无非就是两种(fast遍历到的值等于T ,不等于T)。
2_1.nums[fast]==T时:
nums[slow++]=nums[fast++];
更新slow,并指向一下需要更新的位置。(不删除元素的操作在这里体现)
2_2.nums[fast]!=T时:
fast++;
不能更新slow,slow同时也表示未删除元素的个数。(删除元素的操作在这里体现)
2_3.使用resize成员方法,删除slow位置以及之后的元素。
参resize方法的参数就是slow,因为slow的第二层含义:新数组的个数!
动画演示:
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="T1fRDjR0-1720767420260" src="https://live.csdn.net/v/embed/408944"></iframe>双指针高效删除特定元素
②代码实现
两种分析的情况最终都有fast++,所以最终还可以优化代码编写(代码实现里展示)
时间复杂度O(n),且空间复杂度O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val)
{
int slow=0;
int fast=0;
while(fast<nums.size()){
if(nums[fast]!=val){nums[slow++]=nums[fast];}
fast++;//代码优化成这样,自己体会一下
}
nums.resize(slow);
return slow;
}
};
标签:slow,nums,++,fast,int,数组,移除,指针
From: https://blog.csdn.net/kchick/article/details/140365514