标签:sdn lan BMI 解析 img solution 缓解 min 次数
给定整数数组 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
class Solution {
public int minIncrementForUnique(int[] A) {
// 判空
if(A.length == 0) return 0;
// 初始化变量
int move = 0;
// 排序
Arrays.sort(A);
// 遍历该数组中元素
for(int i = 1; i < A.length;i++){
// 当前元素如果小于等于前面的元素,执行一次move操作
while(A[i] <= A[i-1]){
move++;
A[i]++;
}
}
// 返回最小增量
return move;
}
}
第一时间没能想到啥好的方法,这个耗时简直辣眼睛∑(っ°Д°;)っ
还是贴一下执行用时分布图表里面大佬的代码缓解一下尴尬吧
class Solution {
public int minIncrementForUnique(int[] A) {
// 判空
if(A == null || A.length == 0) {
return 0;
}
// 初始化变量
int[] status = new int[50000];
int counts = 0;
int expect = 0;
// 先统计数组中每位元素出现次数
for(int num : A) {
status[num]++;
}
// 变量新数组
for(int i = 0; i < 50000; i++) {
// 判断
if(status[i] > 1) {
expect = status[i] - 1; // 当前元素超过的数量
counts += expect; // move操作次数
status[i + 1] += expect; // 如下位元素出现次数大于1,则需继续执行move操作
status[i] = 1; // 减少内存消耗
}
}
// 返回结果
return counts;
}
}
果然大佬就是大佬,一开始我也是用的固定数组先把出现次数统计起来的,不过下面的循环判断写法不一样,导致提交超时,还是得多学习学习大佬的思路才行!
?
来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique/submissions/
标签:sdn lan BMI 解析 img solution 缓解 min 次数
原文地址:https://www.cnblogs.com/unrecognized/p/12546089.html