@@ -42,13 +42,20 @@ edit_url: https://github.com/doocs/leetcode/edit/main/lcp/LCP%2040.%20%E5%BF%83%
42
42
43
43
<!-- solution:start -->
44
44
45
- ### 方法一:排序 + 贪心
45
+ ### 方法一:贪心 + 排序
46
46
47
- 排序先取最大的 $cnt$ 个数,如果和为偶数则直接返回答案 。
47
+ 我们注意到,题目选取的是子序列,因此我们可以考虑先对数组进行排序 。
48
48
49
- 否则,找一个已取的最小奇数换成剩余未取的最大偶数,或者找一个已取的最小偶数换成剩下未取的最大奇数,取两者中较大的 。
49
+ 接下来,我们先贪心地选取最大的 $\textit{cnt}$ 个数,如果这些数的和为偶数,则直接返回这个和 $ans$ 。
50
50
51
- 时间复杂度 $O(nlogn)$。
51
+ 否则,我们有两种贪心策略:
52
+
53
+ 1 . 在最大的 $\textit{cnt}$ 个数中,找到一个最小的偶数 $mi1$,然后在剩下的 $n - \textit{cnt}$ 个数中,找到一个最大的奇数 $mx1$,将 $mi1$ 替换为 $mx1$,如果存在这样的替换,那么替换后的和 $ans - mi1 + mx1$ 一定是偶数;
54
+ 1 . 在最大的 $\textit{cnt}$ 个数中,找到一个最小的奇数 $mi2$,然后在剩下的 $n - \textit{cnt}$ 个数中,找到一个最大的偶数 $mx2$,将 $mi2$ 替换为 $mx2$,如果存在这样的替换,那么替换后的和 $ans - mi2 + mx2$ 一定是偶数。
55
+
56
+ 我们取最大的偶数和作为答案。如果不存在偶数和,则返回 $0$。
57
+
58
+ 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组长度。
52
59
53
60
<!-- tabs:start -->
54
61
@@ -57,16 +64,25 @@ edit_url: https://github.com/doocs/leetcode/edit/main/lcp/LCP%2040.%20%E5%BF%83%
57
64
``` python
58
65
class Solution :
59
66
def maxmiumScore (self , cards : List[int ], cnt : int ) -> int :
60
- cards.sort(reverse = True )
61
- t = cards[:cnt]
62
- ans = sum (t)
67
+ cards.sort()
68
+ ans = sum (cards[- cnt:])
63
69
if ans % 2 == 0 :
64
70
return ans
65
- a = min ([v for v in t if v & 1 ], default = inf)
66
- b = min ([v for v in t if v % 2 == 0 ], default = inf)
67
- c = max ([v for v in cards[cnt:] if v % 2 == 0 ], default = - inf)
68
- d = max ([v for v in cards[cnt:] if v & 1 ], default = - inf)
69
- return max (ans - a + c, ans - b + d, 0 )
71
+ n = len (cards)
72
+ mx1 = mx2 = - inf
73
+ for x in cards[: n - cnt]:
74
+ if x & 1 :
75
+ mx1 = x
76
+ else :
77
+ mx2 = x
78
+ mi1 = mi2 = inf
79
+ for x in cards[- cnt:][::- 1 ]:
80
+ if x & 1 :
81
+ mi2 = x
82
+ else :
83
+ mi1 = x
84
+ ans = max (ans - mi1 + mx1, ans - mi2 + mx2, - 1 )
85
+ return 0 if ans < 0 else ans
70
86
```
71
87
72
88
#### Java
@@ -83,26 +99,25 @@ class Solution {
83
99
if (ans % 2 == 0 ) {
84
100
return ans;
85
101
}
86
- int inf = 0x3f3f3f3f ;
87
- int a = inf, b = inf;
88
- for (int i = 0 ; i < cnt; ++ i) {
89
- int v = cards[n - i - 1 ];
90
- if (v % 2 == 1 ) {
91
- a = Math . min(a, v);
102
+ final int inf = 1 << 29 ;
103
+ int mx1 = - inf, mx2 = - inf;
104
+ for (int i = 0 ; i < n - cnt; ++ i) {
105
+ if (cards[i] % 2 == 1 ) {
106
+ mx1 = cards[i];
92
107
} else {
93
- b = Math . min(b, v) ;
108
+ mx2 = cards[i] ;
94
109
}
95
110
}
96
- int c = - inf, d = - inf;
97
- for (int i = cnt; i < n; ++ i) {
98
- int v = cards[n - i - 1 ];
99
- if (v % 2 == 0 ) {
100
- c = Math . max(c, v);
111
+ int mi1 = inf, mi2 = inf;
112
+ for (int i = n - 1 ; i >= n - cnt; -- i) {
113
+ if (cards[i] % 2 == 1 ) {
114
+ mi2 = cards[i];
101
115
} else {
102
- d = Math . max(d, v) ;
116
+ mi1 = cards[i] ;
103
117
}
104
118
}
105
- return Math . max(0 , Math . max(ans - a + c, ans - b + d));
119
+ ans = Math . max(ans - mi1 + mx1, ans - mi2 + mx2);
120
+ return ans < 0 ? 0 : ans;
106
121
}
107
122
}
108
123
```
@@ -114,27 +129,33 @@ class Solution {
114
129
public:
115
130
int maxmiumScore(vector<int >& cards, int cnt) {
116
131
sort(cards.begin(), cards.end());
117
- reverse(cards.begin(), cards.end());
118
- int ans = 0, n = cards.size();
119
- for (int i = 0; i < cnt; ++i) ans += cards[ i] ;
120
- if (ans % 2 == 0) return ans;
121
- int inf = 0x3f3f3f3f;
122
- int a = inf, b = inf, c = -inf, d = -inf;
132
+ int ans = 0;
133
+ int n = cards.size();
123
134
for (int i = 0; i < cnt; ++i) {
124
- int v = cards[ i] ;
125
- if (v % 2 == 1)
126
- a = min(a, v);
127
- else
128
- b = min(b, v);
135
+ ans += cards[ n - i - 1] ;
129
136
}
130
- for (int i = cnt; i < n; ++i) {
131
- int v = cards[ i] ;
132
- if (v % 2 == 0)
133
- c = max(c, v);
134
- else
135
- d = max(d, v);
137
+ if (ans % 2 == 0) {
138
+ return ans;
139
+ }
140
+ const int inf = 1 << 29;
141
+ int mx1 = -inf, mx2 = -inf;
142
+ for (int i = 0; i < n - cnt; ++i) {
143
+ if (cards[ i] % 2) {
144
+ mx1 = cards[ i] ;
145
+ } else {
146
+ mx2 = cards[ i] ;
147
+ }
136
148
}
137
- return max(0, max(ans - a + c, ans - b + d));
149
+ int mi1 = inf, mi2 = inf;
150
+ for (int i = n - 1; i >= n - cnt; --i) {
151
+ if (cards[ i] % 2) {
152
+ mi2 = cards[ i] ;
153
+ } else {
154
+ mi1 = cards[ i] ;
155
+ }
156
+ }
157
+ ans = max(ans - mi1 + mx1, ans - mi2 + mx2);
158
+ return ans < 0 ? 0 : ans;
138
159
}
139
160
};
140
161
```
@@ -143,31 +164,74 @@ public:
143
164
144
165
```go
145
166
func maxmiumScore(cards []int, cnt int) int {
167
+ sort.Ints(cards)
146
168
ans := 0
147
- sort.Slice(cards, func(i, j int) bool { return cards[i] > cards[j] } )
148
- for _, v := range cards[: cnt] {
149
- ans += v
169
+ n := len( cards)
170
+ for i := 0; i < cnt; i++ {
171
+ ans += cards[n-1-i]
150
172
}
151
173
if ans%2 == 0 {
152
174
return ans
153
175
}
154
- inf := 0x3f3f3f3f
155
- a, b, c, d := inf, inf, -inf, -inf
156
- for _, v := range cards[:cnt] {
157
- if v %2 == 1 {
158
- a = min(a, v)
176
+ const inf = 1 << 29
177
+ mx1, mx2 := -inf, -inf
178
+ for _, x := range cards[:n- cnt] {
179
+ if x %2 == 1 {
180
+ mx1 = x
159
181
} else {
160
- b = min(b, v)
182
+ mx2 = x
161
183
}
162
184
}
163
- for _, v := range cards[cnt:] {
164
- if v%2 == 0 {
165
- c = max(c, v)
185
+ mi1, mi2 := inf, inf
186
+ for i := n - 1; i >= n-cnt; i-- {
187
+ if cards[i]%2 == 1 {
188
+ mi2 = cards[i]
166
189
} else {
167
- d = max(d, v)
190
+ mi1 = cards[i]
168
191
}
169
192
}
170
- return max(0, max(ans-a+c, ans-b+d))
193
+ ans = max(-1, max(ans-mi1+mx1, ans-mi2+mx2))
194
+ if ans < 0 {
195
+ return 0
196
+ }
197
+ return ans
198
+ }
199
+ ```
200
+
201
+ #### TypeScript
202
+
203
+ ``` ts
204
+ function maxmiumScore(cards : number [], cnt : number ): number {
205
+ cards .sort ((a , b ) => a - b );
206
+ let ans = 0 ;
207
+ const n = cards .length ;
208
+ for (let i = 0 ; i < cnt ; ++ i ) {
209
+ ans += cards [n - i - 1 ];
210
+ }
211
+ if (ans % 2 === 0 ) {
212
+ return ans ;
213
+ }
214
+ const inf = 1 << 29 ;
215
+ let mx1 = - inf ,
216
+ mx2 = - inf ;
217
+ for (let i = 0 ; i < n - cnt ; ++ i ) {
218
+ if (cards [i ] % 2 === 1 ) {
219
+ mx1 = cards [i ];
220
+ } else {
221
+ mx2 = cards [i ];
222
+ }
223
+ }
224
+ let mi1 = inf ,
225
+ mi2 = inf ;
226
+ for (let i = n - 1 ; i >= n - cnt ; -- i ) {
227
+ if (cards [i ] % 2 === 1 ) {
228
+ mi2 = cards [i ];
229
+ } else {
230
+ mi1 = cards [i ];
231
+ }
232
+ }
233
+ ans = Math .max (ans - mi1 + mx1 , ans - mi2 + mx2 );
234
+ return ans < 0 ? 0 : ans ;
171
235
}
172
236
```
173
237
0 commit comments