【题解】力扣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;
    }
}

作者:LeetCode-Solution

链接:https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/solution/ke-huo-de-de-zui-da-dian-shu-by-leetcode-7je9/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

补充

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

上一篇:Delphi 2010 XE 中使用 JSON 之 SuperObject68-6


下一篇:Leetcode每日一题:1423. 可获得的最大点数