给你一个下标从 0 开始的整数数组
nums
和一个整数k
。你需要执行以下操作 恰好k
次,最大化你的得分:
- 从
nums
中选择一个元素m
。- 将选中的元素
m
从数组中删除。- 将新元素
m + 1
添加到数组中。- 你的得分增加
m
。请你返回执行以上操作恰好
k
次后的最大得分。示例 1:
输入: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:
输入:nums = [5,5,5], k = 2 输出:11 解释:我们需要从 nums 中恰好选择 2 个元素并最大化得分。 第一次选择 5 。和为 5 ,nums = [5,5,6] 。 第二次选择 6 。和为 6 ,nums = [5,5,7] 。 所以我们返回 11 。 11 是可以得到的最大答案。
方案一:
class Solution {
public:
int maximizeSum(vector<int>& nums, int k) {
int max=nums[0];
for(int i=0;i<nums.size();i++){
if(max<nums[i])
max=nums[i];
}
int res=0;
while(k--){
res+=max;
max+=1;
}
return res;
}
};
方案一的实现比较简单,但是有点繁琐,运行速度慢。
方案二
class Solution {
public:
int maximizeSum(vector<int>& nums, int k) {
int maximum=nums[0];
for (int i=1;i<nums.size();i++)
maximum=max(maximum,nums[i]);
int res=0;
while(k--){
res+=maximum;
maximum+=1;
}
return res;
}
};
这段代码将方案一的寻找最大值的方法使用一个max函数来进行优化以后速度提升了很多。因为这一段代码直接迭代数组,而方案一需要使用i来进行访问。
方案三
class Solution {
public:
int maximizeSum(vector<int>& nums, int k) {
int max = *max_element(nums.begin(),nums.end());
return max*k + (k*(k-1))/2;
}
};
这段代码使用了C++标准函数max_element(),该函数用来接受两个迭代器参数,用来寻找最大值的位置,然后在前面加一个解引用操作符*,将迭代器转换为实际最大值。
上述的实际运行效果与题目的随机输入有关,不唯一。