day 1
我双指针的启蒙。这个想法是在太巧妙了。
思路:
定义两个指针,一个fast,一个slow。fast是探寻小兵,负责找可以作为新数组元素的值,slow作为新数组的下标。二者都从 0 开始,一开始的 slow 并没有把第一个数就存进去,所以从第一个下标开始,就可以存储数据,存完之后再++
加入完最后一个元素之后,进行了自加操作,所以此时的slow就是数组的长度
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast = 0, slow = 0;
for(;fast < nums.size(); fast++)
{
if(nums[fast] != val)
nums[slow++] = nums[fast];
}
return slow; // 加入完最后一个元素之后,进行了自加操作,所以此时的slow就是数组的长度
}
};
也可以直接暴力:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = nums.size();
for(int i = 0; i < k; i++)
{
if(nums[i] == val)
{
for(int j = i + 1;j < k; j++)
nums[j - 1]= nums[j]; //进行覆盖,整体向前移动一位
i--; // 移动后,之前的 i 值,要向后退一位,保持一致
k--; // 减了一个元素
}
}
return k;
}
};