滑动窗口系列-Leetcode 1423. 可获得的最大点数

文章目录

  • 问题描述
  • 解题报告
    • 滑动窗口
    • 其他解法
  • 实现代码
  • 参考资料

问题描述

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

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

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

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

示例 1:

输入:cardPoints = [1,2,3,4,5,6,1], k = 3
输出:12
解释:第一次行动,不管拿哪张牌,你的点数总是 1 。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌,最终点数为 1 + 6 + 5 = 12 。

解题报告

滑动窗口

  • 移动右边界时, 更新当前窗口的和tmpSum以及当前窗口数的个数counter
  • 当前窗口内数的个数等于n-k时,移动左边界;
  • 移动左边界时,更新当前窗口的和tmpSum以及当前窗口数的个数counter
  • 开始移动左边界时,当前窗口的数目为n-k,此时更新窗口内的最小和。

其他解法

使用前缀和和后缀和, preSum[i]+postSum[k-i]

实现代码

class Solution {
     
public:
    int maxScore(vector<int>& cardPoints, int k) {
     
        int ans=INT_MAX, l=0,r=0,counter=0,tmpSum=0,sum=0;
        if(cardPoints.size()==k){
     
            for(int i=0;i<cardPoints.size();i++) sum+=cardPoints[i];
            return sum;
        }
        while(r<cardPoints.size()){
     
            sum+=cardPoints[r];
            tmpSum+=cardPoints[r++];
            counter++;
            if(counter==cardPoints.size()-k){
     
                ans=min(ans, tmpSum);
                tmpSum-=cardPoints[l++];
                counter--;
            }
        }
        return sum-ans;
    }
};

参考资料

[1] Leetcode 1423. 可获得的最大点数

你可能感兴趣的:(leetcode,滑动窗口)