Skip to content

Commit e6f0add

Browse files
committed
feat: add solutions to lc problem: No.2098
No.2098.Subsequence of Size K With the Largest Even Sum
1 parent 85457b6 commit e6f0add

File tree

6 files changed

+411
-4
lines changed

6 files changed

+411
-4
lines changed

solution/2000-2099/2098.Subsequence of Size K With the Largest Even Sum/README.md

Lines changed: 150 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,27 +53,174 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
**方法一:贪心 + 排序**
57+
58+
我们注意到,题目选取的是子序列,因此我们可以考虑先对数组进行排序。
59+
60+
接下来,我们先贪心地选取最大的 $k$ 个数,如果这些数的和为偶数,则直接返回这个和 $ans$。
61+
62+
否则,我们有两种贪心策略:
63+
64+
1. 在最大的 $k$ 个数中,找到一个最小的偶数 $mi1$,然后在剩下的 $n - k$ 个数中,找到一个最大的奇数 $mx1$,将 $mi1$ 替换为 $mx1$,如果存在这样的替换,那么替换后的和 $ans - mi1 + mx1$ 一定是偶数;
65+
1. 在最大的 $k$ 个数中,找到一个最小的奇数 $mi2$,然后在剩下的 $n - k$ 个数中,找到一个最大的偶数 $mx2$,将 $mi2$ 替换为 $mx2$,如果存在这样的替换,那么替换后的和 $ans - mi2 + mx2$ 一定是偶数。
66+
67+
我们取最大的偶数和作为答案。如果不存在偶数和,则返回 $-1$。
68+
69+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组长度。
70+
5671
<!-- tabs:start -->
5772

5873
### **Python3**
5974

6075
<!-- 这里可写当前语言的特殊实现逻辑 -->
6176

6277
```python
63-
78+
class Solution:
79+
def largestEvenSum(self, nums: List[int], k: int) -> int:
80+
nums.sort()
81+
ans = sum(nums[-k:])
82+
if ans % 2 == 0:
83+
return ans
84+
n = len(nums)
85+
mx1 = mx2 = -inf
86+
for x in nums[: n - k]:
87+
if x & 1:
88+
mx1 = x
89+
else:
90+
mx2 = x
91+
mi1 = mi2 = inf
92+
for x in nums[-k:][::-1]:
93+
if x & 1:
94+
mi2 = x
95+
else:
96+
mi1 = x
97+
ans = max(ans - mi1 + mx1, ans - mi2 + mx2, -1)
98+
return -1 if ans % 2 else ans
6499
```
65100

66101
### **Java**
67102

68103
<!-- 这里可写当前语言的特殊实现逻辑 -->
69104

70105
```java
106+
class Solution {
107+
public long largestEvenSum(int[] nums, int k) {
108+
Arrays.sort(nums);
109+
long ans = 0;
110+
int n = nums.length;
111+
for (int i = 0; i < k; ++i) {
112+
ans += nums[n - i - 1];
113+
}
114+
if (ans % 2 == 0) {
115+
return ans;
116+
}
117+
final int inf = 1 << 29;
118+
int mx1 = -inf, mx2 = -inf;
119+
for (int i = 0; i < n - k; ++i) {
120+
if (nums[i] % 2 == 1) {
121+
mx1 = nums[i];
122+
} else {
123+
mx2 = nums[i];
124+
}
125+
}
126+
int mi1 = inf, mi2 = inf;
127+
for (int i = n - 1; i >= n - k; --i) {
128+
if (nums[i] % 2 == 1) {
129+
mi2 = nums[i];
130+
} else {
131+
mi1 = nums[i];
132+
}
133+
}
134+
ans = Math.max(-1, Math.max(ans - mi1 + mx1, ans - mi2 + mx2));
135+
return ans % 2 != 0 ? -1 : ans;
136+
}
137+
}
138+
```
71139

140+
### **C++**
141+
142+
```cpp
143+
class Solution {
144+
public:
145+
long long largestEvenSum(vector<int>& nums, int k) {
146+
sort(nums.begin(), nums.end());
147+
long long ans = 0;
148+
int n = nums.size();
149+
for (int i = 0; i < k; ++i) {
150+
ans += nums[n - i - 1];
151+
}
152+
if (ans % 2 == 0) {
153+
return ans;
154+
}
155+
const int inf = 1 << 29;
156+
int mx1 = -inf, mx2 = -inf;
157+
for (int i = 0; i < n - k; ++i) {
158+
if (nums[i] % 2) {
159+
mx1 = nums[i];
160+
} else {
161+
mx2 = nums[i];
162+
}
163+
}
164+
int mi1 = inf, mi2 = inf;
165+
for (int i = n - 1; i >= n - k; --i) {
166+
if (nums[i] % 2) {
167+
mi2 = nums[i];
168+
} else {
169+
mi1 = nums[i];
170+
}
171+
}
172+
ans = max(ans - mi1 + mx1, ans - mi2 + mx2);
173+
return ans % 2 || ans < 0 ? -1 : ans;
174+
}
175+
};
72176
```
73177
74-
### **TypeScript**
178+
### **Go**
179+
180+
```go
181+
func largestEvenSum(nums []int, k int) int64 {
182+
sort.Ints(nums)
183+
ans := 0
184+
n := len(nums)
185+
for i := 0; i < k; i++ {
186+
ans += nums[n-1-i]
187+
}
188+
if ans%2 == 0 {
189+
return int64(ans)
190+
}
191+
const inf = 1 << 29
192+
mx1, mx2 := -inf, -inf
193+
for _, x := range nums[:n-k] {
194+
if x%2 == 1 {
195+
mx1 = x
196+
} else {
197+
mx2 = x
198+
}
199+
}
200+
mi1, mi2 := inf, inf
201+
for i := n - 1; i >= n-k; i-- {
202+
if nums[i]%2 == 1 {
203+
mi2 = nums[i]
204+
} else {
205+
mi1 = nums[i]
206+
}
207+
}
208+
ans = max(-1, max(ans-mi1+mx1, ans-mi2+mx2))
209+
if ans%2 != 0 {
210+
return -1
211+
}
212+
return int64(ans)
213+
}
214+
215+
func max(a, b int) int {
216+
if a > b {
217+
return a
218+
}
219+
return b
220+
}
221+
```
75222

76-
<!-- 这里可写当前语言的特殊实现逻辑 -->
223+
### **TypeScript**
77224

78225
```ts
79226

solution/2000-2099/2098.Subsequence of Size K With the Largest Even Sum/README_EN.md

Lines changed: 135 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,147 @@ No subsequence of nums with length 1 has an even sum.
5454
### **Python3**
5555

5656
```python
57-
57+
class Solution:
58+
def largestEvenSum(self, nums: List[int], k: int) -> int:
59+
nums.sort()
60+
ans = sum(nums[-k:])
61+
if ans % 2 == 0:
62+
return ans
63+
n = len(nums)
64+
mx1 = mx2 = -inf
65+
for x in nums[: n - k]:
66+
if x & 1:
67+
mx1 = x
68+
else:
69+
mx2 = x
70+
mi1 = mi2 = inf
71+
for x in nums[-k:][::-1]:
72+
if x & 1:
73+
mi2 = x
74+
else:
75+
mi1 = x
76+
ans = max(ans - mi1 + mx1, ans - mi2 + mx2, -1)
77+
return -1 if ans % 2 else ans
5878
```
5979

6080
### **Java**
6181

6282
```java
83+
class Solution {
84+
public long largestEvenSum(int[] nums, int k) {
85+
Arrays.sort(nums);
86+
long ans = 0;
87+
int n = nums.length;
88+
for (int i = 0; i < k; ++i) {
89+
ans += nums[n - i - 1];
90+
}
91+
if (ans % 2 == 0) {
92+
return ans;
93+
}
94+
final int inf = 1 << 29;
95+
int mx1 = -inf, mx2 = -inf;
96+
for (int i = 0; i < n - k; ++i) {
97+
if (nums[i] % 2 == 1) {
98+
mx1 = nums[i];
99+
} else {
100+
mx2 = nums[i];
101+
}
102+
}
103+
int mi1 = inf, mi2 = inf;
104+
for (int i = n - 1; i >= n - k; --i) {
105+
if (nums[i] % 2 == 1) {
106+
mi2 = nums[i];
107+
} else {
108+
mi1 = nums[i];
109+
}
110+
}
111+
ans = Math.max(-1, Math.max(ans - mi1 + mx1, ans - mi2 + mx2));
112+
return ans % 2 != 0 ? -1 : ans;
113+
}
114+
}
115+
```
116+
117+
### **C++**
118+
119+
```cpp
120+
class Solution {
121+
public:
122+
long long largestEvenSum(vector<int>& nums, int k) {
123+
sort(nums.begin(), nums.end());
124+
long long ans = 0;
125+
int n = nums.size();
126+
for (int i = 0; i < k; ++i) {
127+
ans += nums[n - i - 1];
128+
}
129+
if (ans % 2 == 0) {
130+
return ans;
131+
}
132+
const int inf = 1 << 29;
133+
int mx1 = -inf, mx2 = -inf;
134+
for (int i = 0; i < n - k; ++i) {
135+
if (nums[i] % 2) {
136+
mx1 = nums[i];
137+
} else {
138+
mx2 = nums[i];
139+
}
140+
}
141+
int mi1 = inf, mi2 = inf;
142+
for (int i = n - 1; i >= n - k; --i) {
143+
if (nums[i] % 2) {
144+
mi2 = nums[i];
145+
} else {
146+
mi1 = nums[i];
147+
}
148+
}
149+
ans = max(ans - mi1 + mx1, ans - mi2 + mx2);
150+
return ans % 2 || ans < 0 ? -1 : ans;
151+
}
152+
};
153+
```
63154
155+
### **Go**
156+
157+
```go
158+
func largestEvenSum(nums []int, k int) int64 {
159+
sort.Ints(nums)
160+
ans := 0
161+
n := len(nums)
162+
for i := 0; i < k; i++ {
163+
ans += nums[n-1-i]
164+
}
165+
if ans%2 == 0 {
166+
return int64(ans)
167+
}
168+
const inf = 1 << 29
169+
mx1, mx2 := -inf, -inf
170+
for _, x := range nums[:n-k] {
171+
if x%2 == 1 {
172+
mx1 = x
173+
} else {
174+
mx2 = x
175+
}
176+
}
177+
mi1, mi2 := inf, inf
178+
for i := n - 1; i >= n-k; i-- {
179+
if nums[i]%2 == 1 {
180+
mi2 = nums[i]
181+
} else {
182+
mi1 = nums[i]
183+
}
184+
}
185+
ans = max(-1, max(ans-mi1+mx1, ans-mi2+mx2))
186+
if ans%2 != 0 {
187+
return -1
188+
}
189+
return int64(ans)
190+
}
191+
192+
func max(a, b int) int {
193+
if a > b {
194+
return a
195+
}
196+
return b
197+
}
64198
```
65199

66200
### **TypeScript**
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class Solution {
2+
public:
3+
long long largestEvenSum(vector<int>& nums, int k) {
4+
sort(nums.begin(), nums.end());
5+
long long ans = 0;
6+
int n = nums.size();
7+
for (int i = 0; i < k; ++i) {
8+
ans += nums[n - i - 1];
9+
}
10+
if (ans % 2 == 0) {
11+
return ans;
12+
}
13+
const int inf = 1 << 29;
14+
int mx1 = -inf, mx2 = -inf;
15+
for (int i = 0; i < n - k; ++i) {
16+
if (nums[i] % 2) {
17+
mx1 = nums[i];
18+
} else {
19+
mx2 = nums[i];
20+
}
21+
}
22+
int mi1 = inf, mi2 = inf;
23+
for (int i = n - 1; i >= n - k; --i) {
24+
if (nums[i] % 2) {
25+
mi2 = nums[i];
26+
} else {
27+
mi1 = nums[i];
28+
}
29+
}
30+
ans = max(ans - mi1 + mx1, ans - mi2 + mx2);
31+
return ans % 2 || ans < 0 ? -1 : ans;
32+
}
33+
};

0 commit comments

Comments
 (0)