【LeetCode】26.删除排序数组中的重复项 (双指针,java实现)

题目

链接

image-20200720105935487

分析

解题思路:

解法: 双指针

首先注意数组是有序的,那么重复的元素一定会相邻。

要求删除重复元素,实际上就是将不重复的元素移到数组的左侧。

考虑用 2 个指针,一个在前记作 p,一个在后记作 q,算法流程如下:

1.比较 pq 位置的元素是否相等。

如果相等,q 后移 1 位
如果不相等,将 q 位置的元素复制到 p+1 位置上,p 后移一位,q 后移 1 位
重复上述过程,直到 q 等于数组长度。

返回 p + 1,即为新数组长度。

画个图理解一下

1.png

代码:

  • Java
 public int removeDuplicates(int[] nums) {
     
    if(nums == null || nums.length == 0) return 0;
    int p = 0;
    int q = 1;
    while(q < nums.length){
     
        if(nums[p] != nums[q]){
     
            nums[p + 1] = nums[q];
            p++;
        }
        q++;
    }
    return p + 1;
}

复杂度分析:

时间复杂度:O(n)。
空间复杂度:O(1)。

优化:

这是大部分题解都没有提出的,在这里提一下。

考虑如下数组:

2.png

此时数组中没有重复元素,按照上面的方法,每次比较时 nums[p] 都不等于 nums[q],因此就会将 q 指向的元素原地复制一遍,这个操作其实是不必要的。

因此我们可以添加一个小判断,当 q - p > 1 时,才进行复制。

代码:

  • Java
public int removeDuplicates(int[] nums) {
     
    if(nums == null || nums.length == 0) return 0;
    int p = 0;
    int q = 1;
    while(q < nums.length){
     
        if(nums[p] != nums[q]){
     
            if(q - p > 1){
     
                nums[p + 1] = nums[q];
            }
            p++;
        }
        q++;
    }
    return p + 1;
}

复杂度分析:

时间复杂度:O(n)。
空间复杂度:O(1)。

你可能感兴趣的:(LeetCode,LeetCode,数据结构,算法,leetcode,java)