移除元素
- 一、题目
- 二、思路
- 三、方法
- 1.暴力解法
- 2.双指针法
- 定义
- 快指针和慢指针
- 代码展示
- 三、力扣刷题
- 1.删除排序数组中的重复项
一、题目
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
二、思路
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
三、方法
1.暴力解法
两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。但暴力解法的时间复杂度是O(n^2)。
var removeElement = function(nums, val) {
let size = nums.length;
for (let i = 0; i < size; i++) {
if (nums[i] === val) { // 发现需要移除的元素
for (let j = i + 1; j < size; j++) {
nums[j - 1] = nums[j]; // 将数组集体向前移动一位
}
i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--; // 此时数组的大小-1
}
}
return size;
};
2.双指针法
定义
通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
快指针和慢指针
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
代码展示
//时间复杂度:O(n)
//空间复杂度:O(1)
var removeElement = (nums, val) => {
//k是慢指针,i是快指针
let k = 0;
for(let i = 0;i < nums.length;i++){
if(nums[i] != val){
nums[k++] = nums[i]
}
} return k;
};
三、力扣刷题
1.删除排序数组中的重复项
这道题不同的地方在于不再是给出一个目标值查找重复项进行删除,而是只要重复了的都要删除重复项,那么同样地,我们可以用双指针法,用快指针定义不包含重复元素的新数组,慢指针用来更新新数组的长度,只需要更改一下慢指针向后移动的条件就行了。因为条件是不重复的元素,所以只要快指针移动时后面一个元素跟前一个元素不重复,那么慢指针就可以更新移动。
var removeDuplicates = function(nums) {
//如果数组长度为0则直接返回0,不需要用指针移动
if(nums.length===0){
return 0
}
//
let slow =0;
for(let fast=0;fast<nums.length;fast++){
if(nums[fast]!== nums[fast-1]){
nums[slow++]=nums[fast]
}
}
return slow
};
移除元素的其他力扣题解会持续更新,关注不迷路哦