跳到主要内容

1423.可获得的最大点数

链接:1423.可获得的最大点数
难度:Medium
标签:数组、前缀和、滑动窗口
简介:给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。

题解 1 - typescript

  • 编辑时间:2021-02-06
  • 执行用时:80ms
  • 内存消耗:46.5MB
  • 编程语言:typescript
  • 解法介绍:利用滑动窗口减少次数判断。
function maxScore(cardPoints: number[], k: number): number {
const len = cardPoints.length;
let rightNum = 0;
let num = cardPoints.slice(0, k).reduce((total, cur) => total + cur, 0);
let max = num;
while (rightNum < k) {
max = Math.max(
max,
(num = num - cardPoints[k - rightNum - 1] + cardPoints[len - rightNum - 1])
);
rightNum++;
}
return max;
}

题解 2 - python

  • 编辑时间:2023-12-03
  • 执行用时:92ms
  • 内存消耗:26.23MB
  • 编程语言:python
  • 解法介绍:滑动窗口记录左右两侧。
class Solution:
def maxScore(self, cardPoints: List[int], k: int) -> int:
n = len(cardPoints)
l = sum(cardPoints[0:k])
r = 0
ans = l
for i in range(k):
r += cardPoints[n - 1 - i]
l -= cardPoints[k - 1 - i]
ans = max(ans, l + r)
return ans

题解 3 - rust

  • 编辑时间:2023-12-03
  • 执行用时:8ms
  • 内存消耗:3.19MB
  • 编程语言:rust
  • 解法介绍:同上。
impl Solution {
pub fn max_score(card_points: Vec<i32>, k: i32) -> i32 {
let k = k as usize;
let n = card_points.len();
let mut l = card_points[0..k].iter().sum::<i32>();
let mut r = 0;
let mut ans = l;
for i in 0..k {
r += card_points[n - 1 - i];
l -= card_points[k - 1 - i];
ans = ans.max(l + r);
}
ans
}
}