记录一下自己做的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;
}
}