[LeetCode]26. Remove Duplicates from Sorted Array

删除重复值

Posted by JinFei on March 27, 2020

题目描述

Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

Example1:

  Given nums = [1,1,2],
    Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively.

    It doesn't matter what you leave beyond the returned length.

Example2:

  Given nums = [0,0,1,1,1,2,2,3,3,4],
    Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively.

    It doesn't matter what values are set beyond the returned length.

NOTE

  • Confused why the returned value is an integer but your answer is an array?

    Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well.

    Internally you can think of this:

    // nums is passed in by reference. (i.e., without making a copy) int len = removeDuplicates(nums);

    // any modification to nums in your function would be known by the caller. // using the length returned by your function, it prints the first len elements. for (int i = 0; i < len; i++) { print(nums[i]); }

解题思路

  • 感觉是一种很巧妙的方式
  • 通过设置快慢指针
  • 首先快慢指针指向起始节点
  • 如果快慢指针指向相等元素,那么我们移动快指针
  • 如果不等,我们可以直接把快指针指向的值赋给慢指针指向的下一格位置(为什么是下一个位置? 因为他们相等,我们保留上一个,重新赋值下一个
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size() == 0){
            return 0;
        }
        int pre = 0;
        int cur = 0;
        while(cur < nums.size()){
            if(nums[pre] == nums[cur]){
                cur++;
            }else{
                nums[++pre] = nums[cur];
                cur++;
            }
        }
        return pre + 1;
    }
};