Maximize Sum Of Array After K Negations

easy array greedy sorting

Problem

You may negate k elements (with repetition allowed). Maximize the final sum.

Inputnums = [4,2,3], k = 1
Output5
Sort, flip negatives in order; if k remains and is odd, flip the smallest absolute value.

def largestSumAfterKNegations(nums, k):
    nums.sort()
    for i in range(len(nums)):
        if k > 0 and nums[i] < 0:
            nums[i] = -nums[i]; k -= 1
    if k % 2 == 1:
        m = min(range(len(nums)), key=lambda i: nums[i])
        nums[m] = -nums[m]
    return sum(nums)
function largestSumAfterKNegations(nums, k) {
  nums.sort((a, b) => a - b);
  for (let i = 0; i < nums.length; i++) {
    if (k > 0 && nums[i] < 0) { nums[i] = -nums[i]; k--; }
  }
  if (k % 2 === 1) {
    let mi = 0;
    for (let i = 1; i < nums.length; i++) if (nums[i] < nums[mi]) mi = i;
    nums[mi] = -nums[mi];
  }
  return nums.reduce((a, b) => a + b, 0);
}
class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++)
            if (k > 0 && nums[i] < 0) { nums[i] = -nums[i]; k--; }
        if (k % 2 == 1) {
            int mi = 0;
            for (int i = 1; i < nums.length; i++) if (nums[i] < nums[mi]) mi = i;
            nums[mi] = -nums[mi];
        }
        int sum = 0; for (int v : nums) sum += v; return sum;
    }
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
    sort(nums.begin(), nums.end());
    for (int i = 0; i < (int)nums.size(); i++)
        if (k > 0 && nums[i] < 0) { nums[i] = -nums[i]; k--; }
    if (k % 2 == 1) {
        int mi = 0;
        for (int i = 1; i < (int)nums.size(); i++) if (nums[i] < nums[mi]) mi = i;
        nums[mi] = -nums[mi];
    }
    return accumulate(nums.begin(), nums.end(), 0);
}
Time: O(n log n) Space: O(1)