Given an integer array nums and an integer k, modify the array in the following way:
choose an index i and replace nums[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] <= 100
1 <= k <= 104
Solutions
Solution 1: Greedy + Counting
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.