《LeetCode刷题笔记》Day3——删除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
这种题就是利用双指针法。
先定义一个快指针在前面,再定义一个慢指针在后面,如果快指针扫到的不是Val元素,则前进一格,慢指针的值等于快指针,并且慢指针++ ;
如果快指针扫到了Val元素,则慢指针不动。但是后面还会慢指针的值等于快指针,只是少了一步++
比如
for (slowIndex = 0; fastIndex < nums.length; fastIndex++) { if (nums[fastIndex] != val) { nums[slowIndex] = nums[fastIndex]; slowIndex++; } }
这里面,每当扫描到快指针的值不等于Val,就大家一起增加;
一旦扫到Val值,那么快指针继续向前,而慢指针不动,同时没有nums[slowIndex]=nums[fastIndex]和slowIndex++这两步;
但继续循环之后,nums{slowIndex]还是会等于nums[fastIndex]。区别在于slowIndex++少了一步,这也就是慢指针和快指针分开的原因。
最后输出慢指针,就是删除之后的数组。
总体代码:
// 时间复杂度:O(n)
// 空间复杂度:O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};

浙公网安备 33010602011771号