持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【LeetCode 945. 使数组唯一的最小增量 】- JavaScript(排序+规律)
题目描述
给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 <= i < nums.length 的下标 i,并将 nums[i] 递增 1。
返回使 nums 中的每个值都变成唯一的所需要的最少操作次数。
示例 1:
输入:nums = [1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。
排序+规律
思路分析:
整体的的思路:通过排序先得到一个有序的数组,然后根据相邻比较得出一个差值,对应的差值累计和就是最后我们需要操作的次数。原因分析,如果后一项比前一项大,那是应该的,因为我们排过序了。但如果后一项和前一项相等,那就不得不做调整,为了让+1的次数尽量少,每次只多+1就不往上加了。但这样做就会出现一个问题,虽然之前排序过,但有可能调整后的前一项会比后一项还大。所以我们发现如果前一项比后一项大,那就让后一项一直加到比前一项多1为止。具体实现步骤如下:
- 对原数组进行排序。
- 对排序后的数组进行遍历,如果当前元素A[i] 小于等于 上个元素A[i-1],则更新当前元素为 A[i-1]+1 移动步数为 A[i-1]+1-A[i]。
- 直到遍历完成,返回记录次数的结果变量即可。
这个技巧要注意:如果只出现一次的数字,原地不动,如果出现2次以上的数字,递增到最近的数字。 如何递增?解法:先减去需要安排的数字,下次遇到空缺时,moves直接加上该空缺
var minIncrementForUnique = function(A) {
let ctn = 0;
let sortArr = A.sort();
for (let i = 0, len = sortArr.length - 1; i < len; i++) {
if(sortArr[i] >= sortArr[i + 1]) {
ctn += sortArr[i] - sortArr[i+1] + 1;
sortArr[i+1] = sortArr[i] + 1;
}
}
return ctn;
};
思考
这题是一道比较考思维的题目,稍微理解了怎么计算递增和变换的关系就可以了。👀🤞
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤