27. 移除元素
题目描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。
元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。
nums 的其余元素和 nums 的大小并不重要。
返回 k。
解析
题目解析
我的理解是,这个题就是让咱去掉数组里的一种元素。
比如示例1
nums为[3,2,2,3]
,val=3
。不就是让咱把数组里的3都去了,然后留下其他的元素吗?
在数组里移除一个元素,其实是用的覆盖,而不是直接把这一节给扣了,然后再接上。后一个覆盖前一个,再同理,把后边的都往前挪一个就完成覆盖。
暴力解法
我们可以直接从前往后遍历数组,每找到一个val,就让它之后的数组元素都往前挪一位。就完成了暴力解法。
但是,这样挪的次数太多了。
快慢指针法
思路:每次之挪动一个元素,把它挪到最后它应该在的位置。
我们依旧会往后遍历数组,但是在找到一个元素不为val时,我们会对它进行移动。
移到哪儿?移到慢指针指向的地方。(你可以拿[3,2,2,3]模拟一下)。
如果移动了一个元素到了它应该到的位置,就应该将慢指针移动到下一个位置——不然下一次快指针又找到了一个不为val的元素,那总不能都存到一个地方吧。
几个关键点:
- 快慢指针在这个解法中的含义?
- 在遍历到一个元素的时候,会进行什么判断?
- 什么是我们移动一个元素的依据?什么时候移动,移到哪里?
class Solution {
public int removeElement(int[] nums, int val) {
int slowPointer=0;
for(int j=0;j<nums.length;j++){
if(nums[j]!=val){
if(slowPointer!=j)
nums[slowPointer]=nums[j];
slowPointer++;
}
}
return slowPointer;
}
}