一、题目

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

点击查看原题

二、思路

这是一个很原始的双指针题,但难题都是由多个简单题综合而来的,所以也别轻视。
由于给定的已经是一个有序数组了,一样的元素一定挨在一起,所以:
1)定义两个指针,为快慢指针,slow和fast,由于一定存在>=0的重复元素,所以fast>=slow
2)当fast位置的元素不等于slow位置元素(即元素从未出现过),将fast位置元素添加到slow+1处,然后两个指针同时向后移动一位

三、代码

  1. class Solution {
  2. public int removeDuplicates(int[] nums) {
  3. if (nums.length <= 1) {
  4. return nums.length;
  5. }
  6. int slow = 0, fast = 1;
  7. while (fast < nums.length) {
  8. if (nums[fast] != nums[slow]) {
  9. nums[++slow] = nums[fast];
  10. }
  11. fast++;
  12. }
  13. return slow + 1;
  14. }
  15. }