记录一下自己做的leetcode题(使数组唯一的最小增量)

记录一下自己做的leetode题
这是每日一题的题型中的
题目如下:
945. 使数组唯一的最小增量
946.
给定整数数组 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

想到了贪心算法应该比较好实现
贪心算法中的一个经典问题:
背包问题
有一个背包,背包容量是M=150kg。有7个物品,物品不可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
⑴贪心策略:选取价值最大者。
⑵贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。
⑶贪心策略:选取单位重量价值最大的物品。

所做的答案以下,刚开始没有什么头绪,看了一下题解后才恍然大悟

class Solution {

    /**
     * @param Integer[] $A
     * @return Integer
     */
    function minIncrementForUnique($A) {
         //贪心算法
        sort($A); // 排序后的数组会递增会出现2种情况(a:相邻的数有N个相等 b:相邻的数不想等并且
        //是递增顺序)
        $count = 0;
        for ($i=1; $i < count($A); $i++) { 
            if ($A[$i - 1] >= $A[$i]):// 前一个大于或者等于当前的,也就是情况a
                // 1、操作次数增加 X 次,X = 前一个 - 当前 + 1, 
                // 2、将当前的值变为比前一个数+1
                $count += $A[$i - 1] - $A[$i] + 1;
                $A[$i] = $A[$i - 1] + 1;
            endif;
        }
        return $count;
    }
}
发布了15 篇原创文章 · 获赞 2 · 访问量 287

猜你喜欢

转载自blog.csdn.net/yemengxiang/article/details/105037693