64
64
65
65
<!-- 这里可写通用的实现逻辑 -->
66
66
67
- 要让左右两侧共 ` k ` 个元素和最大,可以转换为求中间连续数组 ` n - k ` 个元素和最小值 ` mi ` ,然后用数组总和 ` s ` 减去 ` mi ` 得到答案。
67
+ ** 方法一:滑动窗口**
68
+
69
+ 我们可以用一个长度为 $k$ 的滑动窗口来模拟这个过程。
70
+
71
+ 初始时我们将窗口放在数组的末尾,即索引为 $n-k$ 到索引 $n-1$ 的这 $k$ 个位置,窗口内卡牌的点数之和记为 $s$,初始答案 $ans$ 的值也为 $s$。这其实是从数组的开头拿走 $0$ 张卡牌的情况。
72
+
73
+ 接下来,我们考虑从数组的开头依次拿 $1, 2, ..., k$ 张卡牌的情况,假设取到的卡牌为 $cardPoints[ i] $,那么我们将其加入 $s$,由于窗口的长度限制为 $k$,我们需要将 $cardPoints[ n-k+i] $ 从 $s$ 中减去,这样我们就可以计算出拿到的 $k$ 张卡牌的点数之和,更新答案 $ans$。
74
+
75
+ 时间复杂度 $O(k)$,其中 $k$ 给题目中给出的整数。空间复杂度 $O(1)$。
68
76
69
77
<!-- tabs:start -->
70
78
75
83
``` python
76
84
class Solution :
77
85
def maxScore (self , cardPoints : List[int ], k : int ) -> int :
78
- n = len (cardPoints)
79
- s = [0 ] * (n + 1 )
80
- for i in range (n):
81
- s[i + 1 ] = s[i] + cardPoints[i]
82
- mi = inf
83
- for i in range (n):
84
- j = i + (n - k) - 1
85
- if j < n:
86
- mi = min (mi, s[j + 1 ] - s[i])
87
- return s[- 1 ] - mi
86
+ ans = s = sum (cardPoints[- k:])
87
+ for i, x in enumerate (cardPoints[:k]):
88
+ s += x - cardPoints[- k + i]
89
+ ans = max (ans, s)
90
+ return ans
88
91
```
89
92
90
93
### ** Java**
@@ -93,21 +96,17 @@ class Solution:
93
96
94
97
``` java
95
98
class Solution {
96
-
97
99
public int maxScore (int [] cardPoints , int k ) {
98
- int n = cardPoints. length;
99
- int [] s = new int [n + 1 ];
100
- for (int i = 0 ; i < n; ++ i) {
101
- s[i + 1 ] = s[i] + cardPoints[i];
100
+ int s = 0 , n = cardPoints. length;
101
+ for (int i = n - k; i < n; ++ i) {
102
+ s += cardPoints[i];
102
103
}
103
- int mi = Integer . MAX_VALUE ;
104
- for (int i = 0 ; i < n; ++ i) {
105
- int j = i + (n - k) - 1 ;
106
- if (j < n) {
107
- mi = Math . min(mi, s[j + 1 ] - s[i]);
108
- }
104
+ int ans = s;
105
+ for (int i = 0 ; i < k; ++ i) {
106
+ s += cardPoints[i] - cardPoints[n - k + i];
107
+ ans = Math . max(ans, s);
109
108
}
110
- return s[n] - mi ;
109
+ return ans ;
111
110
}
112
111
}
113
112
```
@@ -119,14 +118,13 @@ class Solution {
119
118
public:
120
119
int maxScore(vector<int >& cardPoints, int k) {
121
120
int n = cardPoints.size();
122
- vector<int > s(n + 1);
123
- for (int i = 0; i < n; ++i) s[ i + 1] = s[ i] + cardPoints[ i] ;
124
- int mi = INT_MAX;
125
- for (int i = 0; i < n; ++i) {
126
- int j = i + (n - k) - 1;
127
- if (j < n) mi = min(mi, s[ j + 1] - s[ i] );
121
+ int s = accumulate(cardPoints.end() - k, cardPoints.end(), 0);
122
+ int ans = s;
123
+ for (int i = 0; i < k; ++i) {
124
+ s += cardPoints[ i] - cardPoints[ n - k + i] ;
125
+ ans = max(ans, s);
128
126
}
129
- return s [ n ] - mi ;
127
+ return ans ;
130
128
}
131
129
};
132
130
```
@@ -136,18 +134,16 @@ public:
136
134
```go
137
135
func maxScore(cardPoints []int, k int) int {
138
136
n := len(cardPoints)
139
- s := make([]int, n+1)
140
- for i := 0; i < n; i++ {
141
- s[i+1] = s[i] + cardPoints[i]
137
+ s := 0
138
+ for _, x := range cardPoints[n-k:] {
139
+ s += x
142
140
}
143
- mi := math.MaxInt64
144
- for i := 0; i < n; i++ {
145
- j := i + (n - k) - 1
146
- if j < n {
147
- mi = min(mi, s[j+1]-s[i])
148
- }
141
+ ans := s
142
+ for i := 0; i < k; i++ {
143
+ s += cardPoints[i] - cardPoints[n-k+i]
144
+ ans = max(ans, s)
149
145
}
150
- return s[n] - mi
146
+ return ans
151
147
}
152
148
```
153
149
@@ -156,13 +152,13 @@ func maxScore(cardPoints []int, k int) int {
156
152
``` ts
157
153
function maxScore(cardPoints : number [], k : number ): number {
158
154
const n = cardPoints .length ;
159
- let sum = cardPoints .slice (0 , n - k ).reduce ((r , v ) => r + v , 0 );
160
- let min = sum ;
161
- for (let i = 0 ; i < k ; i ++ ) {
162
- sum += cardPoints [n - k + i ] - cardPoints [ i ];
163
- min = Math .min ( min , sum );
155
+ let s = cardPoints .slice (- k ).reduce ((a , b ) => a + b );
156
+ let ans = s ;
157
+ for (let i = 0 ; i < k ; ++ i ) {
158
+ s += cardPoints [i ] - cardPoints [ n - k + i ];
159
+ ans = Math .max ( ans , s );
164
160
}
165
- return cardPoints . reduce (( r , v ) => r + v , 0 ) - min ;
161
+ return ans ;
166
162
}
167
163
```
168
164
@@ -171,17 +167,160 @@ function maxScore(cardPoints: number[], k: number): number {
171
167
``` rust
172
168
impl Solution {
173
169
pub fn max_score (card_points : Vec <i32 >, k : i32 ) -> i32 {
174
- let (k , n ) = (k as usize , card_points . len ());
175
- let mut sum = card_points
176
- . iter ()
177
- . take (n - k )
178
- . sum :: <i32 >();
179
- let mut min = sum ;
170
+ let n = card_points . len ();
171
+ let k = k as usize ;
172
+ let mut s : i32 = card_points [n - k .. ]. iter (). sum ();
173
+ let mut ans : i32 = s ;
180
174
for i in 0 .. k {
181
- sum += card_points [n - k + i ] - card_points [i ];
182
- min = min . min (sum );
175
+ s += card_points [i ] - card_points [n - k + i ];
176
+ ans = ans . max (s );
177
+ }
178
+ ans
179
+ }
180
+ }
181
+ ```
182
+
183
+ ### ** C#**
184
+
185
+ ``` cs
186
+ public class Solution {
187
+ public int MaxScore (int [] cardPoints , int k ) {
188
+ int n = cardPoints .Length ;
189
+ int s = cardPoints [^ k .. ].Sum ();
190
+ int ans = s ;
191
+ for (int i = 0 ; i < k ; ++ i ) {
192
+ s += cardPoints [i ] - cardPoints [n - k + i ];
193
+ ans = Math .Max (ans , s );
194
+ }
195
+ return ans ;
196
+ }
197
+ }
198
+ ```
199
+
200
+ ### ** PHP**
201
+
202
+ ``` php
203
+ class Solution {
204
+ /**
205
+ * @param Integer[] $cardPoints
206
+ * @param Integer $k
207
+ * @return Integer
208
+ */
209
+ function maxScore($cardPoints, $k) {
210
+ $n = count($cardPoints);
211
+ $s = array_sum(array_slice($cardPoints, -$k));
212
+ $ans = $s;
213
+ for ($i = 0; $i < $k; ++$i) {
214
+ $s += $cardPoints[$i] - $cardPoints[$n - $k + $i];
215
+ $ans = max($ans, $s);
216
+ }
217
+ return $ans;
218
+ }
219
+ }
220
+ ```
221
+
222
+ ### ** Kotlin**
223
+
224
+ ``` kotlin
225
+ class Solution {
226
+ fun maxScore (cardPoints : IntArray , k : Int ): Int {
227
+ val n = cardPoints.size
228
+ var s = cardPoints.sliceArray(n - k until n).sum()
229
+ var ans = s
230
+ for (i in 0 until k) {
231
+ s + = cardPoints[i] - cardPoints[n - k + i]
232
+ ans = maxOf(ans, s)
233
+ }
234
+ return ans
235
+ }
236
+ }
237
+ ```
238
+
239
+ ### ** Swift**
240
+
241
+ ``` swift
242
+ class Solution {
243
+ func maxScore (_ cardPoints : [Int ], _ k : Int ) -> Int {
244
+ let n = cardPoints.count
245
+ var s = cardPoints.suffix (k).reduce (0 , + )
246
+ var ans = s
247
+ for i in 0 ..< k {
248
+ s += cardPoints[i] - cardPoints[n - k + i]
249
+ ans = max (ans, s)
250
+ }
251
+ return ans
252
+ }
253
+ }
254
+ ```
255
+
256
+ ### ** JavaScript**
257
+
258
+ ``` js
259
+ /**
260
+ * @param {number[]} cardPoints
261
+ * @param {number} k
262
+ * @return {number}
263
+ */
264
+ var maxScore = function (cardPoints , k ) {
265
+ const n = cardPoints .length ;
266
+ let s = cardPoints .slice (- k).reduce ((a , b ) => a + b);
267
+ let ans = s;
268
+ for (let i = 0 ; i < k; ++ i) {
269
+ s += cardPoints[i] - cardPoints[n - k + i];
270
+ ans = Math .max (ans, s);
271
+ }
272
+ return ans;
273
+ };
274
+ ```
275
+
276
+ ### ** Dart**
277
+
278
+ ``` dart
279
+ class Solution {
280
+ int maxScore(List<int> cardPoints, int k) {
281
+ int n = cardPoints.length;
282
+ int s = cardPoints.sublist(n - k).reduce((a, b) => a + b);
283
+ int ans = s;
284
+ for (int i = 0; i < k; ++i) {
285
+ s += cardPoints[i] - cardPoints[n - k + i];
286
+ ans = s > ans ? s : ans;
287
+ }
288
+ return ans;
289
+ }
290
+ }
291
+ ```
292
+
293
+ ### ** Ruby**
294
+
295
+ ``` rb
296
+ # @ param {Integer[]} card_points
297
+ # @ param {Integer} k
298
+ # @ return {Integer}
299
+ def max_score (card_points , k )
300
+ n = card_points.length
301
+ s = card_points[- k..].sum
302
+ ans = s
303
+ k.times do |i |
304
+ s += card_points[i] - card_points[n - k + i]
305
+ ans = [ans, s].max
306
+ end
307
+ ans
308
+ end
309
+ ```
310
+
311
+ ### ** Scala**
312
+
313
+ ``` scala
314
+ object Solution {
315
+ def maxScore (cardPoints : Array [Int ], k : Int ): Int = {
316
+ val n = cardPoints.length
317
+ var s = cardPoints.takeRight(k).sum
318
+ var ans = s
319
+ for (i <- 0 until k) {
320
+ s += cardPoints(i) - cardPoints(n - k + i)
321
+ ans = ans.max(s)
183
322
}
184
- card_points . iter () . sum :: < i32 >() - min
323
+ ans
185
324
}
186
325
}
187
326
```
0 commit comments