To maximize the sum, pick the k largest numbers. If their sum is even, return it. If odd, try to swap the smallest odd in the k largest with the largest even outside, or the smallest even in the k largest with the largest odd outside, to make the sum even. If not possible, return -1.
#include<vector>#include<algorithm>usingnamespace std;
classSolution {
public:int largestEvenSum(vector<int>& nums, int k) {
sort(nums.rbegin(), nums.rend());
int n = nums.size();
int sum =0;
int minOdd =1e9+1, minEven =1e9+1;
int maxOdd =-1, maxEven =-1;
for (int i =0; i < k; ++i) {
sum += nums[i];
if (nums[i] %2) minOdd = min(minOdd, nums[i]);
else minEven = min(minEven, nums[i]);
}
for (int i = k; i < n; ++i) {
if (nums[i] %2) maxOdd = max(maxOdd, nums[i]);
else maxEven = max(maxEven, nums[i]);
}
if (sum %2==0) return sum;
int ans =-1;
if (minOdd <1e9+1&& maxEven !=-1)
ans = max(ans, sum - minOdd + maxEven);
if (minEven <1e9+1&& maxOdd !=-1)
ans = max(ans, sum - minEven + maxOdd);
return ans;
}
};
// Leetcode signature: int largestEvenSum(vector<int>& nums, int k);
import java.util.*;
classSolution {
publicintlargestEvenSum(int[] nums, int k) {
Arrays.sort(nums);
int n = nums.length, sum = 0;
int minOdd = Integer.MAX_VALUE, minEven = Integer.MAX_VALUE;
int maxOdd =-1, maxEven =-1;
for (int i = 0; i < k; ++i) {
int v = nums[n-1-i];
sum += v;
if (v % 2 == 1) minOdd = Math.min(minOdd, v);
else minEven = Math.min(minEven, v);
}
for (int i = k; i < n; ++i) {
int v = nums[n-1-i];
if (v % 2 == 1) maxOdd = Math.max(maxOdd, v);
else maxEven = Math.max(maxEven, v);
}
if (sum % 2 == 0) return sum;
int ans =-1;
if (minOdd < Integer.MAX_VALUE&& maxEven !=-1)
ans = Math.max(ans, sum - minOdd + maxEven);
if (minEven < Integer.MAX_VALUE&& maxOdd !=-1)
ans = Math.max(ans, sum - minEven + maxOdd);
return ans;
}
}
funlargestEvenSum(nums: IntArray, k: Int): Int {
val arr = nums.sortedDescending()
var sum = 0var minOdd = Int.MAX_VALUE; var minEven = Int.MAX_VALUE
var maxOdd = -1; var maxEven = -1for (i in0 until k) {
sum += arr[i]
if (arr[i] % 2==1) minOdd = minOf(minOdd, arr[i])
else minEven = minOf(minEven, arr[i])
}
for (i in k until arr.size) {
if (arr[i] % 2==1) maxOdd = maxOf(maxOdd, arr[i])
else maxEven = maxOf(maxEven, arr[i])
}
if (sum % 2==0) return sum
var ans = -1if (minOdd < Int.MAX_VALUE && maxEven != -1)
ans = maxOf(ans, sum - minOdd + maxEven)
if (minEven < Int.MAX_VALUE && maxOdd != -1)
ans = maxOf(ans, sum - minEven + maxOdd)
return ans
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
deflargestEvenSum(nums, k):
nums = sorted(nums, reverse=True)
topk = nums[:k]
rest = nums[k:]
s = sum(topk)
if s %2==0:
return s
min_odd = min((x for x in topk if x %2), default=None)
min_even = min((x for x in topk if x %2==0), default=None)
max_odd = max((x for x in rest if x %2), default=None)
max_even = max((x for x in rest if x %2==0), default=None)
ans =-1if min_odd isnotNoneand max_even isnotNone:
ans = max(ans, s - min_odd + max_even)
if min_even isnotNoneand max_odd isnotNone:
ans = max(ans, s - min_even + max_odd)
return ans
pubfnlargest_even_sum(nums: Vec<i32>, k: i32) -> i32 {
letmut nums = nums;
nums.sort_unstable_by(|a, b| b.cmp(a));
let k = k asusize;
let topk =&nums[..k];
let rest =&nums[k..];
let s: i32= topk.iter().sum();
if s %2==0 { return s; }
let min_odd = topk.iter().filter(|&&x| x %2!=0).min().copied();
let min_even = topk.iter().filter(|&&x| x %2==0).min().copied();
let max_odd = rest.iter().filter(|&&x| x %2!=0).max().copied();
let max_even = rest.iter().filter(|&&x| x %2==0).max().copied();
letmut ans =-1;
iflet (Some(mo), Some(me)) = (min_odd, max_even) {
ans = ans.max(s - mo + me);
}
iflet (Some(me), Some(mo)) = (min_even, max_odd) {
ans = ans.max(s - me + mo);
}
ans
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
functionlargestEvenSum(nums: number[], k: number):number {
nums.sort((a, b) =>b-a);
consttopk=nums.slice(0, k);
constrest=nums.slice(k);
consts=topk.reduce((a, b) =>a+b, 0);
if (s%2===0) returns;
constminOdd= Math.min(...topk.filter(x=>x%2===1), Infinity);
constminEven= Math.min(...topk.filter(x=>x%2===0), Infinity);
constmaxOdd= Math.max(...rest.filter(x=>x%2===1), -Infinity);
constmaxEven= Math.max(...rest.filter(x=>x%2===0), -Infinity);
letans=-1;
if (minOdd!==Infinity&&maxEven!==-Infinity)
ans= Math.max(ans, s-minOdd+maxEven);
if (minEven!==Infinity&&maxOdd!==-Infinity)
ans= Math.max(ans, s-minEven+maxOdd);
returnans;
}