class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k)
{
int sum = 0;
// 进行k次取反操作
while (k > 0)
{
// 对数组进行排序
sort(nums.begin(), nums.end());
// 将最小的元素取反
nums[0] = -nums[0];
// 减少k的值
k--;
}
// 计算数组的总和
for (int num : nums)
{
sum += num;
}
return sum;
}
};
核心思想
- 每次都取反数组中绝对值最小的元素,以确保每次取反操作都对数组总和的影响最小化。
- 通过排序,找到当前数组中的最小元素,并对其进行取反操作。
- 重复上述步骤,直到完成
k
次取反操作。
考虑 nums = [3, -1, 0, 2]
和 k = 3
:
-
第一次操作:
- 排序后:
[-1, 0, 2, 3]
- 取反最小元素:
[1, 0, 2, 3]
k = 2
- 排序后:
-
第二次操作:
- 排序后:
[0, 1, 2, 3]
- 取反最小元素:
[0, -1, 2, 3]
k = 1
- 排序后:
-
第三次操作:
- 排序后:
[-1, 0, 2, 3]
- 取反最小元素:
[1, 0, 2, 3]
k = 0
- 排序后:
最后计算总和:1 + 0 + 2 + 3 = 6
,返回 6
。