1005. K 次取反后最大化的数组和
题目描述
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i
并将 A[i]
替换为 -A[i]
,然后总共重复这个过程 K
次。(我们可以多次选择同一个索引 i
。)
以这种方式修改数组后,返回数组可能的最大和。
示例 1:
输入: A = [4,2,3], K = 1
输出: 5
解释: 选择索引 (1,) ,然后 A 变为 [4,-2,3]。
复制代码
示例 2:
输入: A = [3,-1,0,2], K = 3
输出: 6
解释: 选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。
复制代码
示例 3:
输入: A = [2,-3,-1,5,-4], K = 2
输出: 13
解释: 选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。
复制代码
解析
首先对数组进行排序,然后就可以取较小的值进行取反操作
- 步骤
- 对数组排序
- 将负数全部取反
- 判断
k
的值,如果k
已经为0
,就可以停止取反操作 - 如果
k>0
,就再对数组排一次序 - 对排序后的数组中的第一个元素进行取反操作,直到
k=0
代码
class Solution
{
public:
int largestSumAfterKNegations(vector<int> &nums, int k)
{
sort(nums.begin(), nums.end());
int sum = 0;
// 求和
for (auto num : nums)
{
sum += num;
}
return sum;
}
void selectIndex(vector<int> &nums)
{
// 判断元素是否是负数
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] <= 0 && k > 0)
{
nums[i] = -nums[i];
k--;
}
}
// 重新排序,现在的元素都是 >= 0 的
sort(nums.begin(); nums.end());
// 判断 k 是否大于0
// 如果 k 还有剩余,只对第一个数字进行取反操作
while (k > 0)
{
nums[0] = -nums[0];
k--;
}
}
};
复制代码