给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element
一开始是想用两个指针,前指针负责判断是否与val相等,后指针负责覆盖。
如果覆盖前指针不动,再次判断覆盖数字是否与val相等。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len= nums.size();
int i=len;
int k=0;
for (int j=0;j<len;j++){printf("i%d j%d k%d j+k%d\n",i,j,k,j+k );
if(nums[j]==val){
k++;
i--;
if (k+j>=len-1)
break;
nums[j]=nums[j+k];
if(j==0){k--;}
else j=j-1;
}
}
return i;
}
};
这样虽然解决了覆盖数据是否与val相等,但当覆盖数据是val且前指针走到val原本位置时会再次使返回值减1导致解答出错。
如果判断val存在后删除,指针集体迁移,时间复杂度高
反过来想
前指针指定当前位置,后指针指定判断位置
判断不是val,无事发生,判断没有通过,前指针不动,后指针后移判断,通过后覆盖,前指针移动;若没通过,前指针继续不动,后指针后移。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k=0;
for (int j=0;j<nums.size();j++){
if(nums[j]!=val){
nums[k]=nums[j];
k++;
}
}
return k;
}
};
喵喵喵?