1005.K次取反后最大化的数组和
题目链接:K次取反后最大化的数组和
思路:先把数组元素按绝对值由大到小排序,排序后进行遍历把负数取反,一定要先排序再取反才能确保先把绝对值大的负数取反。如果数组中负数全部取一次反后还没达到K次。判断剩余次数的奇偶性,若是偶数不用做任何操作了,若为奇数把数组中最小值取一次反即可,最后计算出最大化的数组和。
// 时间复杂度: O(nlogn)
// 空间复杂度: O(1)
class Solution {
public:
static bool cmp(int a, int b)
{
return abs(a) > abs(b);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
int ret = 0;
sort(nums.begin(), nums.end(), cmp);
for (int i = 0; i < nums.size(); ++i)
{
if (nums[i] < 0 && k > 0)
{
nums[i] *= -1;
k--;
}
}
if (k % 2 == 1) nums[nums.size() - 1] *= -