LC27. 移除元素
题目描述
这是 LeetCode 上的(27. 移除元素) ,难度为 简单。
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
1 |
|
示例 1:
1 |
|
示例 2:
1 |
|
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
题解
双指针
本题目要求不另外使用其他空间,实现在数组容器中删除元素后,将剩余元素移动到前面。
所以我们使用双指针的思想,快指针i
,慢指针j
。
- 慢指针
j
所指向的地皮(位置)是快指针i
找到的非val
元素的定居所。 - 慢指针
j
所指向的地皮(位置)只能为val
元素的家或者是已被动迁走的非val
元素的家,故这片地皮可以用来安置新搬来的非val元素
的房子,不会闹纠纷。 - 所以已被安置好的地皮为慢指针
j
前面的所有地皮,故return j
代码
1 |
|
复杂度
- 时间复杂度:$O(n)$
- 空间复杂度:$O(1)$
最后
我现在的做法有些复杂了,描述起来也比较困难,就放个代码在这里。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
int i = 0;
int j = 0;
while(i < len){
if(nums[i] != val){
// swap(nums[i], nums[j])
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
i++;
j++;
} else {
i++;
}
}
return len - i + j;
}
};
LC27. 移除元素
https://blog.daynoti.com/posts/18183/