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

题目要求

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

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

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

判题标准:

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

ini 复制代码
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:

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

示例 2:

ini 复制代码
输入: 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 我们的数据就乱了

具体实现

优化之后的代码
ini 复制代码
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();
}

优化之前的代码

ini 复制代码
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;

}
测试用例
ini 复制代码
// 添加测试方法
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);
}

测试结果

相关推荐
※DX3906※20 小时前
Java排序算法--全面详解面试中涉及的排序
java·开发语言·数据结构·面试·排序算法
cur1es21 小时前
【JVM类加载&双亲委派模型&垃圾回收机制】
java·jvm·gc·垃圾回收·类加载·双亲委派模型
Mr.朱鹏21 小时前
JVM-GC垃圾回收案例
java·jvm·spring boot·算法·spring·spring cloud·java-ee
焦糖玛奇朵婷21 小时前
实测扭蛋机小程序:开发简单,互动有趣
java·大数据·程序人生·小程序·软件需求
Nan_Shu_61421 小时前
学习: 尚硅谷Java项目之小谷充电宝(3)
java·后端·学习
wzqllwy21 小时前
8 大经典排序算法(Java 实现):原理 + Demo + 核心分析
java·算法·排序算法
智能工业品检测-奇妙智能21 小时前
AIFlowy如何实现与现有Spring Boot项目的无缝集成?
java·spring boot·后端
從南走到北21 小时前
JAVA无人共享无人健身房物联网结合系统源码支持小程序+公众号+APP+H5
java·物联网·小程序
Nuopiane21 小时前
MyPal3(3)
java·开发语言
Chan161 天前
LeetCode 热题 100 | 矩阵
java·开发语言·数据结构·算法·spring·java-ee·intellij-idea