【题解】力扣1423. 可获得的最大点数

题目来源

1423. 可获得的最大点数

思路

滑动窗口

由于每次只能拿开头和结尾的牌,所以最后剩下的必然是连续的n-k张牌。可以用滑动窗口的方法来求解中间连续的牌的最小值,然后利用一开始的总和减去剩余卡牌的点数之和的最小值,得出拿走的卡牌的点数之和的最大值。

代码

class Solution {
    public int maxScore(int[] cardPoints, int k) {
        int n = cardPoints.length;
        // 滑动窗口大小为 n-k
        int windowSize = n - k;
        // 选前 n-k 个作为初始值
        int sum = 0;
        for (int i = 0; i < windowSize; ++i) {
            sum += cardPoints[i];
        }
        int minSum = sum;
        for (int i = windowSize; i < n; ++i) {
            // 滑动窗口每向右移动一格,增加从右侧进入窗口的元素值,并减少从左侧离开窗口的元素值
            sum += cardPoints[i] - cardPoints[i - windowSize];
            minSum = Math.min(minSum, sum);
        }
        return Arrays.stream(cardPoints).sum() - minSum;
    }
}

参考链接

  1. LeetCode-Solution

补充

也可以用前缀和解。通过前缀和求出任意区间[i,j]之间的和,即取完牌后剩下牌的点数之和。

posted @ 2021-02-07 22:28  zzzzzy2k  阅读(81)  评论(0)    收藏  举报