[Leetcode] Remove Duplicates from Sorted Array 移除有序数组中的重复元素

Remove Duplicates from Sorted Array I

Given a sorted array, 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 in place with constant memory.app

For example, Given input array nums = [1,1,2], this

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 new length.spa

双指针法

复杂度

时间 O(N) 空间 O(1)指针

思路

咱们能够将不重复的序列存到数列前面,由于不重复序列的长度必定小于等于总序列,因此不用担忧覆盖的问题。具体来讲,用两个指针,快指针指向当前数组遍历到的位置,慢指针指向不重复序列下一个存放的位置,这样咱们一旦遍历到一个不重复的元素,就把它复制到不重复序列的末尾。判断重复的方法是记录上一个遍历到的数字,看是否同样。code

代码

public class Solution {
    public int removeDuplicates(int[] nums) {
        if(nums.length == 0) return 0;
        int dup = nums[0];
        int end = 1;
        for(int i = 1; i < nums.length; i++){
            if(nums[i]!=dup){
                nums[end] = nums[i];
                dup = nums[i];
                end++;
            }
        }
        return end;
    }
}

Remove Duplicates from Sorted Array II

Follow up for "Remove Duplicates": What if duplicates are allowed at most twice?排序

For example, Given sorted array nums = [1,1,1,2,2,3],element

Your function should return length = 5, with the first five elements of nums being 1, 1, 2, 2 and 3. It doesn't matter what you leave beyond the new length.rem

双指针法

复杂度

时间 O(N) 空间 O(1)input

思路

思路和上题同样,区别在于记录前两个遍历到的数字来帮助咱们判断是否出现了第三遍。若是当前数字和前一个数字的前一个同样的话,说明出现了第三次。

代码

public class Solution {
    public int removeDuplicates(int[] nums) {
        if(nums.length <= 2) return nums.length;
        int dup1 = nums[0];
        int dup2 = nums[1];
        int end = 2;
        for(int i = 2; i < nums.length; i++){
            if(nums[i]!=dup1){
                nums[end] = nums[i];
                dup1 = dup2;
                dup2 = nums[i];
                end++;
            }
        }
        return end;
    }
}

Follow Up 后续

Q:若是数组没有排序的话如何解?A:能够先将其排序再用一样方法求解,然而时间复杂度将达到O(NlogN),若是咱们改用哈希表或集合来记录数字出现次数,能够用O(N)空间获得O(N)的时间。

相关文章
相关标签/搜索