题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
示例:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
思路:快慢指针
去重才需要升序,移除指定元素则不需要数组有序!
若fast指针=val,则fast++跳过
若fast指针不等于val时,先将fast指的值赋给numsslow,然后再slow和fast都往前一个位置, 这样等于val的就全被删除,且返回的是slow 而不是slow+1;
注意: 这里 先赋值再slow++
,保证nums[0…slow-1]中不包含val的值!而在LeetCode 26中,是先slow++再赋值,这样可以保留一个重复元素的值
Java实现:
class Solution {
public int removeElement(int[] nums, int val) {
int slow=0;
int fast=0;
int n=nums.length;
while(fast<n){
if(nums[fast]==val){ // fast遇到要删除的元素,则跳过
fast++;
}else{
nums[slow]=nums[fast]; // 先赋值,再 ++ !
slow++;
fast++;
}
}
return slow;
}
}