算法 | 每日一题 | 可获得的最大点数 | 滑动窗口

1423. 可获得的最大点数

原题地址: 力扣每日一题:可获得的最大点数

几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。

每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。

你的点数就是你拿到手中的所有卡牌的点数之和。

给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。

这两天正好在做一些滑动窗口的题目,这道题使用滑动窗口解题会非常简单,因为取走的数是两边的数,所以把中间的数看作一个长度为 n - k 的滑动窗口即可。

class Solution {
    public int maxScore(int[] cardPoints, int k) {
        int n = cardPoints.length;
        int windowSize = n - k;
        // 最前面作为滑动窗口初始值,不断移动寻找 sum 的最小值
        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;
    }
}

如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤
个人主页:星不易 ❤
每日一题专栏:不易|力扣算法每日一题 ❤

你可能感兴趣的:(不易,力扣算法每日一题,算法,java)