1、描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
数组,等于一个val,删除
3、思路
快慢指针,遍历,如果不等就使用快指针覆盖慢指针!
而我想的是相等的时候把右边的往左移动,结果是没写出来
等闲了再看下
4、notes
和昨天的一样,删除重复元素,如果不等就覆盖,而不是只想到相等了从右往左移动,
解题步骤:
1、循环开始前设置慢指针等于0
2、一层循环,在循环中进行覆盖(不等的时候,就是结果,所以在不等的时候进行快指针覆盖慢指针)
5、复杂度
时间O(n)
空间O(1)
6、code
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i = 0;
int n = nums.size();
for (int j = 0; j < n; j++){
if(nums[j] != val){
nums[i] = nums[j];
i++;
}
}
return i;
}
};
7、昨天删除重复元素,只留一个
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
7.2、code
class Solution { //双指针
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if(n <= 1) return n;
int i = 0;
for(int j = 1;j < n; j++){
if(nums[i] != nums[j]){
i++;
//if(j - i > 0){
nums[i] = nums[j];
//}
}
}
return i+1;
}
};