给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
我没注意到“有序”这一条件,这一写法也适用于无序的(最后的倔强)
思路:fast用于寻找不重复的元素,slow存储已经筛选过的元素。将每个元素与已经重排的元素比较,如果没有,就添加进去;如果有,就跳过。不是和nums后面的比较,这点我第一次就搞反了
class Solution {public int removeDuplicates(int[] nums) {int slow = 0;for(int fast = 1;fast<nums.length;fast++){//从第二个元素向前比较,所以fast取1不取0for(int j = 0;j<slow+1;j++){//遍历已经重排的部分,也就是nums[]前面的部分if(nums[fast]==nums[j]){break;//出现重复说明前面部分已经有这个元素了}if(j==slow){//遍历结束判断,说明前面部分没有这个元素nums[++slow] = nums[fast];//把这个元素加进去}}}return (slow+1);//slow是最大下标,不是元素个数}
}
双指针“slow”“fast”真好用啊