移除元素
- 一、题目
- 二、思路
- 三、方法
- 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};
移除元素的其他力扣题解会持续更新,关注不迷路哦