【LeetCode刷题-滑动窗口】--1423.可获得的最大点数

1423.可获得的最大点数

【LeetCode刷题-滑动窗口】--1423.可获得的最大点数_第1张图片

思路:

数组cardPoints的长度为n,由于只能从开头和末尾拿k张卡牌,所以最后剩下的必然是连续的n-k张卡牌,可以通过求出剩余卡牌点数之和的最小值,来求出拿走卡牌点数之和的最大值

算法:

由于剩余卡牌是连续的,使用一个固定长度为n-k的滑动窗口对数组cardPoints进行遍历,求出滑动窗口最小值,然后用所有卡牌的点数之和减去该最小值,即得到了拿走卡牌点数之和的最大值

class Solution {
    public int maxScore(int[] cardPoints, int k) {
        //使用滑动窗口进行计算
        int n = cardPoints.length,sum = 0;
        int windows = n - k;
        //计算第一个窗口的和
        for(int i = 0; i < windows;i++){
            sum += cardPoints[i];
        }
        int minSum = sum;
        for(int i = windows;i<n;i++){
            sum = sum + cardPoints[i] - cardPoints[i - windows];
            minSum = Math.min(minSum,sum);
        }
        //计算数组所有元素之和-窗口内最小值=做大点数
        return Arrays.stream(cardPoints).sum() - minSum;
    }
}

注意:

Arrays.stream(cardPoints).sum():为计算数组所有元素之和

你可能感兴趣的:(LeetCode,leetcode,算法)