(Java)leetcode-945 Minimum Increment to Make Array Unique(使数组唯一的最小增量)

2023-11-17

题目描述

给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。

返回使 A 中的每个值都是唯一的最少操作次数。

示例 1:
输入:[1,2,2]
输出:1
解释:经过一次 move 操作,数组将变为 [1, 2, 3]。

示例 2:
输入:[3,2,1,2,1,7]
输出:6
解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。

提示:

0 <= A.length <= 40000
0 <= A[i] < 40000

思路1:排序 O(nlogn)

首先将数组进行排序,然后从左到右遍历数组:

  • 如果当前元素大于上一个元素,保持不变;
  • 如果当前元素小于等于上一个元素,就需要增加当前元素,使其大于上一个元素。

时间复杂度:O(nlogn),主要的复杂度在排序上。

class Solution {
    public int minIncrementForUnique(int[] A) {
        // 先排序
        Arrays.sort(A);
        int move = 0;
        // 遍历数组,若当前元素小于等于它的前一个元素,则将其变为前一个数+1
        for (int i = 1; i < A.length; i++) {
            if (A[i] <= A[i - 1]) {
                int pre = A[i];
                A[i] = A[i - 1] + 1;
                move += A[i] - pre;
            }
        }
        return move;
    }
}

执行用时:16 ms, 在所有 Java 提交中击败了67.56%的用户
内存消耗:47.1 MB, 在所有 Java 提交中击败了100.00%的用户

思路2:计数 O(n+k)

上面方法中,排序需要 O(nlogn) 的时间,比较昂贵。我们尝试不进行排序的方法。

例如输入 [3, 2, 1, 2, 1, 7],计数之后有两个 1 和两个 2。我们先看最小的数,两个 1 重复了,需要有一个增加到 2,这样 2 的数量变成了三个。在三个 2 中,又有两个需要增加到 3,然后又出现了两个 3…… 以此类推,可以计算出需要增加的次数。

我们可以用 map来计数。不过既然题目中说明了整数的范围在 0 到 40000 之间,我们不妨直接用一个大小为 40000 的数组做计数。

需要注意的是,虽然整数的范围是 0 到 40000,但是由于整数还会因为增加而变大,超出 40000 的范围。例如极端的情况:所有数都是 39999。所以需要对整数中最大的数单独处理。代码如下:

public int minIncrementForUnique(int[] A) {
    int[] count = new int[40000];
    int max = 0;
    for (int a : A) {
        count[a]++; // 计数
        max = Math.max(max, a); // 计算数组中的最大值
    }
    
    int res = 0;
    for (int j = 0; j < max; j++) {
        if (count[j] > 1) {
            // 有 count[j] - 1 个数需要增加
            res += count[j] - 1; 
            // 增加后这些数将被统计到下一个位置中
            count[j+1] += count[j] - 1;
        }
    }
    
    // count[max] 单独计算,是因为可能超出 40000 的边界
    if (count[max] > 1) {
        int d = count[max] - 1; 
        // 有 d 个数需要增加
        // 分别增加为 max + 1, max + 2, ... max + d
        // 使用等差数列公式求和
        res += (1 + d) * d / 2;
    }
    
    return res;
}


执行用时:4 ms, 在所有 Java 提交中击败了98.67%的用户
内存消耗:46.7 MB, 在所有 Java 提交中击败了100.00%的用户

这种解法的时间复杂度不能简单地写成 O(n)。设 n 为数组元素的个数,k 为数组元素的可能取值个数(本期中 k = 40000),这个算法的时间复杂度是 O(n + k)。

作者:nettee

对比

如果 k 比较小的话,计数方法的时间复杂度可以认为是 O(n),比排序方法要快。这道题 k 取值 40000 算比较小的数,所以用计数方法会很快。如果 k 的值很大,就不能用计数方法。

虽然计数方法不需要排序,但我们可以把它看成是一种计数排序。计数排序的时间复杂度恰好也是 O(n + k)。所以实际上两种方法都是用的排序,只不过一个是普通排序,一个是计数排序。我们在算法书中学过,计数排序这种排序方法是非比较排序,可以突破 O(nlogn) 的复杂度下限。但是它会对输入的性质有所要求,例如要求 k 比较小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(Java)leetcode-945 Minimum Increment to Make Array Unique(使数组唯一的最小增量) 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • Python矩阵赋值详解

    在Python中 矩阵是一种常见的数据结构 广泛应用于数学 科学和工程领域 在本文中 我们将详细介绍如何使用Python给矩阵赋值 在Python中 可以使用多种方式来表示和操作矩阵 其中最常用的是使用嵌套列表或NumPy库中的数组对象 我
  • JavaScript高级技巧:深入探索JavaScript语言的高级特性和用法

    当我们谈论JavaScript高级技巧时 以下是一些示例来说明这些概念 闭包 Closures function outerFunction var outerVariable Hello function innerFunction co
  • 自从学了这套框架,自动化+性能都搞定了

    框架介绍 1 HttpRunner 是一款面向 HTTP S 协议的通用测试框架 只需编写维护一份YAML JSON脚本 即可实现自动化测试 性能测试 线上监控 持续集成等多种测试需求 2 Locust Locust是一款易于使用的分布式用
  • 数据库关系代数运算之连接

    联接有三种 联接和自然联接 这里是算术比较符 外联接 1 联接 从R和S的笛卡儿乘积中选取满足条件 i j 的元组 2 自然联接 naturaljoin 两个关系R和S的自然联接操作具体计算过程如下 计算R S 设R和S的公共属性是A1 A
  • 【转】SQL删除的三个语句:DROP、TRUNCATE、 DELETE 的区别

    主要介绍了SQL删除语句DROP TRUNCATE DELETE 的区别 帮助大家更好的理解和学习sql语句 感兴趣的朋友可以了解下 DROP 1 DROP TABLE test 删除表test 并释放空间 将test删除的一干二净 TRU
  • CMake Error: Maybe need administrative privileges.

    安装opencv时 到make install 这一步报错 解决 权限不够 前面加上sudo 即 sudo make install
  • qt中的QString::number()的精度使用问题

    1 QString number average f 5 这里的 f 表示的是 f 方式结果是0 00 所以后面的5表示的就是输出的时候保留5位小数 通常 QString str str QString number 23 34567899
  • 使用tp5内cache缓存,存储手机短信验证码

    设置手机短信验证码缓存方法 设置手机短信验证码缓存 User JW Email jw 333 163 com Date param data cache public function setRegSmsCache data cache C
  • Gitee API的使用|如何批量删除Gitee下的所有仓库

    前言 那么这里博主先安利一些干货满满的专栏了 首先是博主的高质量博客的汇总 这个专栏里面的博客 都是博主最最用心写的一部分 干货满满 希望对大家有帮助 高质量博客汇总https blog csdn net yu cblog category
  • python语音播报

    python3 pip install pyttsx3 python2 pip install pyttsx 文本转语音 import pyttsx3 import time str Come on Catherine engine pyt
  • java 强密码验证策略工具类

    java 强密码验证策略工具类 package com neusoft caeid common utils import java util regex Matcher import java util regex Pattern aut
  • ChatGPT论文考试满绩,高等教育该如何应对人工智能挑战?

    近日 ChatGPT引发热议 一方面 ChatGPT表现亮眼 有大学生利用ChatGPT在开卷课堂上取得满绩的优异成绩 另一方面 部分院校 学术期刊却对ChatGPT在高等教育领域的推进保持谨慎态度 甚至有高校明确禁止这项工具技术的使用 那
  • 算法题:Rod Cutting

    算法题 Rod Cutting 一 题目 二 代码 三 结果 一 题目 二 代码 lengths 1 1 3 4 lengths 5 4 4 2 2 8 def rodOffcut lengths resut resut append le
  • Android自定义控件--如何在XML文件中使用自定义属性

    前言 你好 我是Cici 这几天在做一个小项目的时候 用到了自定义控件 为了方便在XML中进行配置 于是需要用到自定义属性 特此记下用法 方便复习的同时也希望对大家有所帮助 一 为什么需要自定义控件 Android本身提供了很多控件 比如T
  • 1024 视频拼接

    题目描述 你将会获得一系列视频片段 这些片段来自于一项持续时长为 T 秒的体育赛事 这些片段可能有所重叠 也可能长度不一 视频片段 clips i 都用区间进行表示 开始于 clips i 0 并于 clips i 1 结束 我们甚至可以对
  • pyinstaller打包Transformers 报错No such file or directory

    问题描述 Traceback most recent call last File transformers utils import utils py line 1086 in get module File importlib init
  • Go开发者路线图2019,请收下这份指南

    Go是Google开发的一种静态 强类型 编译型 并发型 并具有垃圾回收功能的类C编程语言 2009以开源项目的形式发布 2012年发布1 0稳定版本 距今已经十年了 其性能类似于Java和C 但速度极快 适合搭载于web服务器 用于高性能
  • LeetCode1652. 拆炸弹

    题目描述 1652 拆炸弹 力扣 LeetCode 题目描述看的不是很清楚 直接看用例 这道题是简单题 取模 防止数组访问越界 C语言代码如下 int decrypt int code int codeSize int k int retu
  • 数据分桶

    数据分桶是一种数据预处理技术 用于减少次要观察误差的影响 是一种将多个连续值分组为较少数量的 桶 的方法 例如 例如我们有一组关于人年龄的数据 如下图所示 现在我们希望将他们的年龄分组到更少的间隔中 可以通过设置一些条件来实现 分桶的数据不
  • (Java)leetcode-945 Minimum Increment to Make Array Unique(使数组唯一的最小增量)

    题目描述 给定整数数组 A 每次 move 操作将会选择任意 A i 并将其递增 1 返回使 A 中的每个值都是唯一的最少操作次数 示例 1 输入 1 2 2 输出 1 解释 经过一次 move 操作 数组将变为 1 2 3 示例 2 输入