leetcode 算法之删除有序数组中的重复项

0 阅读3分钟

题目要求

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k。去重后,返回唯一元素的数量 k

nums 的前 k 个元素应包含 排序后 的唯一数字。下标 k - 1 之后的剩余元素可以忽略。

判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有断言都通过,那么您的题解将被 通过

 

示例 1:

输入: nums = [1,1,2]
输出: 2, nums = [1,2,_]
解释: 函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2:

输入: nums = [0,0,1,1,1,2,2,3,3,4]
输出: 5, nums = [0,1,2,3,4,_,_,_,_,_]
解释: 函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

 

提示:

  • 1 <= nums.length <= 3 * 104
  • -100 <= nums[i] <= 100
  • nums 已按 非递减 顺序排列。

题目分析

这个边需要让我们要去掉重复元素,我们思考下用什么数据结构 对没有错 用set set也是集合的一种 他的特性就是不能存在重复的元素,所以我们需要通过创建一个set 集合然后 循环遍历我们原本数组里面的数据添加到我们的数组里面 然后再遍历我们的set 然后把去重后的数据又赋值给我们的 nums 数组, 最后对我们的数组进行重新排序 因为中间用了set 我们的数据就乱了

具体实现

  • 优化之后的代码
public int removeDuplicates(int[] nums) {
    if (nums.length == 0) return 0;

    // 使用HashSet去重
    Set<Integer> uniqueNumbers = new HashSet<>();
    for (int num : nums) {
        uniqueNumbers.add(num);
    }

    // 将去重后的元素复制回原数组
    int index = 0;
    for (Integer number : uniqueNumbers) {
        nums[index++] = number;
    }
    // 对去重后的部分进行排序
    Arrays.sort(nums, 0, uniqueNumbers.size());
    return uniqueNumbers.size();
}
  • 优化之前的代码

public int removeDuplicates2(int[] nums) {
    Set<Integer>number=new HashSet<>();
    for (int num : nums) {
        number.add(num);
    }
    int index=0;
    for (int i = 0; i <number.size() ; i++) {
        nums[index]= (int) number.toArray()[i];
        index++;
    }
    // 对去重后的部分进行排序
    Arrays.sort(nums, 0, number.size());
    return  nums.length;

}
测试用例

// 添加测试方法
public static void main(String[] args) {
    Leetcode2 solution = new Leetcode2();

    // 测试用例1:普通情况
    int[] nums1 = {1, 1, 2};
    int result1 = solution.removeDuplicates(nums1);
    System.out.println("测试1 - 长度: " + result1);
    System.out.print("数组: ");
    for (int i = 0; i < result1; i++) {
        System.out.print(nums1[i] + " ");
    }
    System.out.println();

    // 测试用例2:多个重复元素
    int[] nums2 = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4};
    int result2 = solution.removeDuplicates(nums2);
    System.out.println("测试2 - 长度: " + result2);
    System.out.print("数组: ");
    for (int i = 0; i < result2; i++) {
        System.out.print(nums2[i] + " ");
    }
    System.out.println();

    // 测试用例3:空数组
    int[] nums3 = {};
    int result3 = solution.removeDuplicates(nums3);
    System.out.println("测试3 - 长度: " + result3);
}

测试结果

image.png