删除有序数组中的重复项

144 阅读1分钟

1、List集合

使用java中的List集合,遍历数组,判断集合中是否已经有该元素,如果没有,则把该元素放入集合中,最后集合中的元素放回数组,就是最终答案。

    public int removeDuplicates(int[] nums) {
        List<Integer> list = new ArrayList();
        for(int i = 0;i < nums.length;i++){
            if(!list.contains(nums[i])){
                list.add(nums[i]);
            }
        }
        for(int i = 0;i < list.size();i++){
            nums[i] = list.get(i);
        }
        return list.size();
    }
}

2、双指针法

一个指针 i 进行数组遍历,另外一个指针 j 指向有效数组的最后一个位置。

只有当 i 所指向的值和 j 不一致(不重复),才将 i 的值添加到 j 的下一位置。

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

3、通用解法

为了使得解法更加普遍,我们将保留1位换成保留k位。

  • 由于是保留k个数字,所以前k位我们可以直接保留
  • 对于后面的数字,判断与当前写入位置前的k位数字进行笔记比较,只要不一样,就可以保留
    public int removeDuplicates(int[] nums) {   
        return process(nums, 1);
    }
    int process(int[] nums, int k) {
        int idx = 0; 
        for (int x : nums) {
            if (idx < k || nums[idx - k] != x) nums[idx++] = x;
        }
        return idx;
    }
}