To maximize the sum, flip the smallest (most negative) numbers first. If there are flips left after all negatives are positive, flip the smallest number (which will be positive) as needed. This greedy approach ensures the sum is maximized after exactly k negations.
classSolution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
for (int i =0; i < nums.size() && k >0; ++i) {
if (nums[i] <0) {
nums[i] =-nums[i];
--k;
}
}
sort(nums.begin(), nums.end());
if (k %2==1) nums[0] =-nums[0];
int ans =0;
for (int x : nums) ans += x;
return ans;
}
};
classSolution {
publicintlargestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
for (int i = 0; i < nums.length&& k > 0; i++) {
if (nums[i]< 0) {
nums[i]=-nums[i];
k--;
}
}
Arrays.sort(nums);
if (k % 2 == 1) nums[0]=-nums[0];
int ans = 0;
for (int x : nums) ans += x;
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution {
funlargestSumAfterKNegations(nums: IntArray, k: Int): Int {
nums.sort()
var k = k
for (i in nums.indices) {
if (nums[i] < 0&& k > 0) {
nums[i] = -nums[i]
k-- }
}
nums.sort()
if (k % 2==1) nums[0] = -nums[0]
return nums.sum()
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution:
deflargestSumAfterKNegations(self, nums: list[int], k: int) -> int:
nums.sort()
for i in range(len(nums)):
if nums[i] <0and k >0:
nums[i] =-nums[i]
k -=1 nums.sort()
if k %2==1:
nums[0] =-nums[0]
return sum(nums)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
impl Solution {
pubfnlargest_sum_after_k_negations(mut nums: Vec<i32>, mut k: i32) -> i32 {
nums.sort();
for i in0..nums.len() {
if nums[i] <0&& k >0 {
nums[i] =-nums[i];
k -=1;
}
}
nums.sort();
if k %2==1 {
nums[0] =-nums[0];
}
nums.iter().sum()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classSolution {
largestSumAfterKNegations(nums: number[], k: number):number {
nums.sort((a, b) =>a-b);
for (leti=0; i<nums.length&&k>0; i++) {
if (nums[i] <0) {
nums[i] =-nums[i];
k--;
}
}
nums.sort((a, b) =>a-b);
if (k%2===1) nums[0] =-nums[0];
returnnums.reduce((a, b) =>a+b, 0);
}
}