数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili
数组是一块连续的空间 因此不能直接把值删了,而是应该删除一个数之后把后面的数字向前挪动。 因此我们直接使用erase()删除的话会超时:
for(auto it=nums.begin();it!=nums.end();)
{
if(*it==val)
{
it=nums.erase(it);
}
}
return nums.size();
}
因为erase()并不是O(1)复杂度,它的底层是把这个数删除之后把后面的数向前挪动,复杂度是O(n)。/
思路1 双指针
fast遍历数组 寻找新数组需要的元素(!=val的元素)
slow代表新数组
fast和slow都指向同一个数组,如图(a-01):
fast把不是val的数全部给slow,slow就一定是一个满足题目要求的不包含Val重复值的新数组。
当fast下标所在值是新数组slow要的元素时,fast就把值给slow,然后fast和solw都++
当fast找到的值吧是新数组要的元素时,slow停止++,fast++,跳到下个元素,如图(a-02)演变为(a-03)的过程:
此时fast所指向的3是新数组slow所要的元素,fast把4给给slow,然后fast和slow都++,如图(a-04)演变为(a-05)-(a-06)):
3不是新数组slow要的元素,fast++,slow停止++。然后fast=5,是新数组要的元素,把5给给slow:
此时slow所在的位置就是新数组的最后一个新表,return slow即可。
code
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
for(int fast=0;fast<nums.size();fast++)
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};