前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使数组唯一的最小增量

使数组唯一的最小增量

作者头像
木子星兮
发布2020-07-16 17:09:15
6320
发布2020-07-16 17:09:15
举报
文章被收录于专栏:前端小码农前端小码农

JavaScript实现leetcode 945. 使数组唯一的最小增量

题目描述

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

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

示例 1:

代码语言:javascript
复制
输入:[1,2,2]
输出:1
解释:经过一次 move 操作,数组将变为 [1, 2, 3]。

示例 2:

代码语言:javascript
复制
输入:[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(n^2)

第二种:排序

  1. 先排序
  2. 遍历数组
    • 用一个队列来保存当前重复需要递增的一些值
    • 找到前一个值和当前值差值大于1的,说明可以将之前重复的值递增到 [A[i - 1] + 1]这个区间范围内的数

3. 遍历完成后,队列不为空,则可以将剩下的值依次递增为 [A[n−1]+1,∞)中的数字, A[n−1]代表数组的最后一个值。

解题方法

直接用排序实现。

代码语言:javascript
复制
/**
 * @param {number[]} A
 * @return {number}
 */
var minIncrementForUnique = function(A) {
    A.sort((a, b) => a - b);
    const queue = [];
    let result = 0;
    let prev = A[0] - 1;
    for(let i = 0; i < A.length; i++) {
        if(A[i] === prev) {
            queue.push(A[i]);
        } else if(A[i] === prev + 1) {
            prev++;
        } else {
            // 队列不为空,则需要先处理队列中的值
            if(queue.length) {
                const n = queue.shift();
                // 直接更新到要更新的值
                result += prev + 1 - n;
                // 每次加1
                prev++;
                // 队列不为空,因此还是保留在当前值,而不往后遍历
                i--;
            } else {
                prev = A[i];
            }
        }
    }
    // 队列不为空,则可以将剩下的值依次递增为 [prev+1,∞)中的数字,prev代表数组的最后一个值。
    while(queue.length) {
        const n = queue.shift();
        result += prev + 1 - n;
        prev++;
    }
    return result;
};
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 牧码的星星 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路分析
  • 解题方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档