080J. Remove Duplicates from Sorted Array II

https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/submissions/

Method Best

思路是这样的,双指针。如果数组长度小于 2,直接返回原数组length. size是慢指针,i是快指针。一开始就指向第三位。并且size始终指向已经确认无误位置的下一位。 只要快指针所指的值,和size-2处不同,那么就取快指针的值给nums[size]。注意是size-2处。 如果相同意味着已经有两个这种数了。

  • [1(size - 2),1,1(i,size),2,2,3] 开始 由于 size - 2 和 i 相等,没有操作 i++

  • [1(size - 2),1,1(size),2(i),2,3] size - 2 < i 的值,i 的值 赋给 size

  • [1,1(size - 2),2,2(size),2(i),3] size - 2 < i 的值,i 的值 赋给 size

  • [1,1,2(size - 2),2,2(size),3(i)] size - 2 < i 的值,i 的值 赋给 size

  • [1,1,2,2(size - 2),3,3(size)] i超出,循环停止,此时size = 5 是正确的。

public int removeDuplicates(int[] nums) {
    if(nums.length < 2+1){
        return nums.length;
    }
    int size = 2;
    for(int i = 2; i < nums.length; i++){
        if(nums[i] > nums[size-2]){
            nums[size++] = nums[i];
        }
    }
    return size;
}

for k:

public int removeDuplicates(int[] nums) {
    if(nums.length < k+1){
        return nums.length;
    }
    int size = k;
    for(int i = k; i < nums.length; i++){
        if(nums[i] > nums[size-k]){
            nums[size++] = nums[i];
        }
    }
    return size;
}

concise:

public int removeDuplicates(int[] nums) {
    int size = 0;
    for(int n : nums){
      if(size < 2 || n > nums[size - 2]){
        nums[size++]= n;
      }
    }
    return size;
}

2023

之前的写法可读性比较一般:

class Solution {
    public int removeDuplicates(int[] nums) {
        int lo = 0;
        int candidate = nums[0];
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == candidate) {
                count++;
            } else {
                candidate = nums[i];
                count = 1;
            }
            if (count <= 2) {
                nums[lo] = nums[i];
                lo++;
            }
        }
        return lo;
    }
}

Last updated

Was this helpful?