一、题目
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
二、思路
这是一个很原始的双指针题,但难题都是由多个简单题综合而来的,所以也别轻视。
由于给定的已经是一个有序数组了,一样的元素一定挨在一起,所以:
1)定义两个指针,为快慢指针,slow和fast,由于一定存在>=0的重复元素,所以fast>=slow
2)当fast位置的元素不等于slow位置元素(即元素从未出现过),将fast位置元素添加到slow+1处,然后两个指针同时向后移动一位
三、代码
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length <= 1) {
return nums.length;
}
int slow = 0, fast = 1;
while (fast < nums.length) {
if (nums[fast] != nums[slow]) {
nums[++slow] = nums[fast];
}
fast++;
}
return slow + 1;
}
}