# 2098. Subsequence of Size K With the Largest Even Sum
###### tags: `Leetcode` `Medium` `Two Pointers`
Link: https://leetcode.com/problems/subsequence-of-size-k-with-the-largest-even-sum/
## 思路
### 思路一 $O(NlogN)$ $O(N)$
将$nums$分成奇数组和偶数组,各自从大到小排序。显然,如果奇数取$0$个,那么偶数就取前$k$个;如果奇数取前$1$个,那么偶数就取前$k-1$个...于是只要两个指针$(i,j)$,$i$在奇数组从前往后移动,$j$在偶数组从后往前移动,用$k$次找出最大的$presum1+presum2$.
需要注意的有两点。首先,不是每一种(i,j)组合得到的presum1+presum2都是偶数,我们肯定会舍弃掉不合条件的组合。
### 思路二 $O(NlogN)$ $O(1)$
参考[这里](https://leetcode.com/problems/subsequence-of-size-k-with-the-largest-even-sum/discuss/1620312/Sum-k-largest-numbers-O(n))
先针对所有数字排序,取k个最大的,如果sum为偶数 done
否则找到前k个里面最小的一个奇数和一个偶数(因为要替换的一定是他们)
然后遍历除了前k个之前的所有数字 看是否能补齐k个数
(之前自己想要找到前k个里面最小的一个奇数和一个偶数,和后边的数字里面最大的一个奇数和一个偶数 要分情况讨论有点麻烦)
## Code
### 思路一
```java=
class Solution {
public long largestEvenSum(int[] nums, int k) {
List<Integer> even = new ArrayList<>();
List<Integer> odd = new ArrayList<>();
for(int num:nums){
if(num%2==0) even.add(num);
else odd.add(num);
}
Collections.sort(even, Collections.reverseOrder());
Collections.sort(odd, Collections.reverseOrder());
long sum = -1;
long[] sum1 = new long[even.size()+1], sum2 = new long[odd.size()+1];
for(int i = 0;i < even.size();i++){
sum1[i+1] = even.get(i) + sum1[i];
}
for(int i = 0;i < odd.size();i++){
sum2[i+1] = odd.get(i) + sum2[i];
}
int p1 = Math.min(k, even.size());
int p2 = k-p1;
while(p1>=0 && p2<sum2.length){
if((sum1[p1]+sum2[p2]) %2==0){
sum = Math.max(sum1[p1]+sum2[p2], sum);
}
p1--;
p2++;
}
return sum;
}
}
```
### 思路二
java
```java=
class Solution {
public long largestEvenSum(int[] nums, int k) {
Arrays.sort(nums);
long sum = 0;
for(int i=0; i<k; i++){
sum += nums[nums.length-1-i];
}
if(sum%2==0) return sum;
int[] min_k = new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE};
long ans = -1;
for(int i=0; i<k; i++){
min_k[nums[nums.length-1-i] % 2] = Math.min(min_k[nums[nums.length-1-i] % 2], nums[nums.length-1-i]);
}
for(int i=k; i<nums.length; i++){
ans = Math.max(ans, sum-min_k[1-(nums[nums.length-1-i]%2)]+nums[nums.length-1-i]);
}
return ans;
}
}
```
c++
```cpp=
class Solution {
public:
long long largestEvenSum(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
long long sum = 0;
int n = nums.size();
for(int i=0; i<k; i++){
sum += nums[n-1-i];
}
if(sum%2==0) return sum;
long long ans = -1;
int min[2];
for(int i=n-1; i>=n-k; i--){
min[nums[i]%2] = nums[i];
}
for(int i=n-k-1; i>=0; i--){
ans = max(ans, nums[i]+sum-min[1-nums[i]%2]);
}
return ans;
}
};
```