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 - 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
    }
}
题解 3 - 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