LC 2656. K 个元素的最大和

题目描述

这是 LeetCode 上的 2656. K 个元素的最大和 ,难度为 简单

给你一个下标从 0 开始的整数数组 nums 和一个整数 k

你需要执行以下操作恰好 k 次,最大化你的得分:

  1. nums 中选择一个元素 m
  2. 将选中的元素 m 从数组中删除。
  3. 将新元素 m + 1 添加到数组中。
  4. 你的得分增加 m

请你返回执行以上操作恰好 k 次后的最大得分。

示例 1:

1
2
3
4
5
6
7
8
9
10
输入:nums = [1,2,3,4,5], k = 3

输出:18

解释:我们需要从 nums 中恰好选择 3 个元素并最大化得分。
第一次选择 5 。和为 5 ,nums = [1,2,3,4,6] 。
第二次选择 6 。和为 6 ,nums = [1,2,3,4,7] 。
第三次选择 7 。和为 5 + 6 + 7 = 18 ,nums = [1,2,3,4,8] 。
所以我们返回 18
18 是可以得到的最大答案。

示例 2:
1
2
3
4
5
6
7
8
9
输入:nums = [5,5,5], k = 2

输出:11

解释:我们需要从 nums 中恰好选择 2 个元素并最大化得分。
第一次选择 5 。和为 5 ,nums = [5,5,6] 。
第二次选择 6 。和为 6 ,nums = [5,5,7] 。
所以我们返回 11
11 是可以得到的最大答案。

提示:

  • $1 <= nums.length <= 100$
  • $1 <= nums[i] <= 100$
  • $1 <= k <= 100$

数学

为了使得分最高,每次应从 nums 中选最大值,选完后重放仍为最大值。

假设原始 nums 中的最大值为 max,那么问题转换为「等差数列」求和:首项为 max,末项为 max + k - 1,项数为 $k$,公差为 $1$。

Java 代码:

1
2
3
4
5
6
7
class Solution {
public int maximizeSum(int[] nums, int k) {
int max = 0;
for (int x : nums) max = Math.max(max, x);
return k * (max + max + k - 1) / 2;
}
}

C++ 代码:
1
2
3
4
5
6
7
8
class Solution {
public:
int maximizeSum(vector<int>& nums, int k) {
int maxv = 0;
for (auto x : nums) maxv = max(maxv, x);
return k * (maxv + maxv + k - 1) / 2;
}
};

Python 代码:
1
2
3
class Solution:
def maximizeSum(self, nums: List[int], k: int) -> int:
return k * (2 * max(nums) + k - 1) // 2

TypeScript 代码:
1
2
3
4
5
function maximizeSum(nums: number[], k: number): number {
let max = 0;
for (const x of nums) max = Math.max(max, x);
return k * (max + max + k - 1) / 2;
};

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(1)$

最后

这是我们「刷穿 LeetCode」系列文章的第 No.2656 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。