1005. Maximize Sum Of Array After K Negations
Description
Given an integer array nums and an integer k, modify the array in the following way:
- choose an index
iand replacenums[i]with-nums[i].
You should apply this process exactly k times. You may choose the same index i multiple times.
Return the largest possible sum of the array after modifying it in this way.
Example 1:
Input: nums = [4,2,3], k = 1 Output: 5 Explanation: Choose index 1 and nums becomes [4,-2,3].
Example 2:
Input: nums = [3,-1,0,2], k = 3 Output: 6 Explanation: Choose indices (1, 2, 2) and nums becomes [3,1,0,2].
Example 3:
Input: nums = [2,-3,-1,5,-4], k = 2 Output: 13 Explanation: Choose indices (1, 4) and nums becomes [2,3,-1,5,4].
Constraints:
1 <= nums.length <= 104-100 <= nums[i] <= 1001 <= k <= 104
Solutions
Solution 1: Greedy + Counting
Thinking
Repeatedly negating the current minimum \(k\) times is optimal. Both \(n\) and \(k\) are at most \(10^4\), but finding the minimum each time needs an extra selection structure. Values lie in \([-100,100]\), so we need not sort the original array.
To maximize the sum we should flip the most negative numbers first. If an odd number of flips remain and there is no zero, the smallest positive value must be flipped once more.
A frequency map consumes flips from \(-100\) to \(-1\), optionally flips the smallest positive, and finally sums value times count.
We observe that to maximize the sum of the array, we should try to turn the smallest negative numbers into positive numbers.
Given that the range of elements is \([-100, 100]\), we can use a hash table \(\textit{cnt}\) to count the occurrences of each element in the array \(\textit{nums}\). Then, starting from \(-100\), we iterate through \(x\). If \(x\) exists in the hash table, we take \(m = \min(\textit{cnt}[x], k)\) as the number of times to negate the element \(x\). We then subtract \(m\) from \(\textit{cnt}[x]\), add \(m\) to \(\textit{cnt}[-x]\), and subtract \(m\) from \(k\). If \(k\) becomes \(0\), the operation is complete, and we exit the loop.
If \(k\) is still odd and \(\textit{cnt}[0] = 0\), we need to take the smallest positive number \(x\) in \(\textit{cnt}\), subtract \(1\) from \(\textit{cnt}[x]\), and add \(1\) to \(\textit{cnt}[-x]\).
Finally, we traverse the hash table \(\textit{cnt}\) and sum the products of \(x\) and \(\textit{cnt}[x]\) to get the answer.
The time complexity is \(O(n + M)\), and the space complexity is \(O(M)\). Here, \(n\) and \(M\) are the length of the array \(\textit{nums}\) and the size of the data range of \(\textit{nums}\), respectively.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |