3075. 幸福值最大化的选择方案
题目描述:
给你一个长度为 n 的数组 happiness ,以及一个 正整数 k 。
n 个孩子站成一队,其中第 i 个孩子的 幸福值 是 happiness[i] 。你计划组织 k 轮筛选从这 n 个孩子中选出 k 个孩子。
在每一轮选择一个孩子时,所有 尚未 被选中的孩子的 幸福值 将减少 1 。注意,幸福值 不能 变成负数,且只有在它是正数的情况下才会减少。
选择 k 个孩子,并使你选中的孩子幸福值之和最大,返回你能够得到的 最大值 。
示例 1:
输入:happiness = [1,2,3], k = 2
输出:4
解释:按以下方式选择 2 个孩子:
- 选择幸福值为 3 的孩子。剩余孩子的幸福值变为 [0,1] 。
- 选择幸福值为 1 的孩子。剩余孩子的幸福值变为 [0] 。注意幸福值不能小于 0 。
所选孩子的幸福值之和为 3 + 1 = 4 。
示例 2:
输入:happiness = [1,1,1,1], k = 2
输出:1
解释:按以下方式选择 2 个孩子:
- 选择幸福值为 1 的任意一个孩子。剩余孩子的幸福值变为 [0,0,0] 。
- 选择幸福值为 0 的孩子。剩余孩子的幸福值变为 [0,0] 。
所选孩子的幸福值之和为 1 + 0 = 1 。
示例 3:
输入:happiness = [2,3,4,5], k = 1
输出:5
解释:按以下方式选择 1 个孩子:
- 选择幸福值为 5 的孩子。剩余孩子的幸福值变为 [1,2,3] 。
所选孩子的幸福值之和为 5 。
提示:
- 1 <= n == happiness.length <= 2 * 10^5
- 1 <= happiness[i] <= 10^8
- 1 <= k <= n
解题分析及思路:
思路:
本题可以使用贪心算法进行解答:
- 首先对数组进行排序
- 优先选择幸福值最大的k个孩子,其幸福值为
max(happiness[i] - count, 0)
在选择的过程中,此时选中孩子的幸福值会减少1,所以我们可以使用一个变量count来记录当前轮次的选择次数,然后每次选择的时候,我们可以计算当前孩子的幸福值为 max(happiness[i] - count, 0)
,然后count加1,直到挑选到k个孩子。
func maximumHappinessSum(happiness []int, k int) int64 {
sort.Ints(happiness)
var count int
var result int64
var index int = len(happiness) - 1
for k > 0 {
temp := happiness[index] - count
if temp > 0 {
result += int64(temp)
}
count++
index--
k--
}
return result
}
复杂度:
- 时间复杂度:O(N*logN)
- 空间复杂度:O(1)
执行结果:
- 执行耗时:195 ms,击败了100.00% 的Go用户
- 内存消耗:10.60 MB,击败了100.00% 的Go用户