- 1423 可获得的最大点数
- 几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
- 每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
- 你的点数就是你拿到手中的所有卡牌的点数之和。
- 给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards
【解题思路】滑动窗口:最近的几道题用到了滑动窗口方法,这个题最终剩下的是固定长度和顺序的子数组,可以转化为寻找点数之和最小minSum的窗口,用总和减去minSum即得到结果。通过维护长度一定len的窗口,每往右边移动一个,计算新的窗口总和。
class Solution {
public:
int maxScore(vector<int>& cardPoints, int k) {
int n=cardPoints.size(), len=n-k;
int sum = 0, minSum =INT_MAX, maxSum=0;
for(int i=0; i<n; ++i){
if(i<len)
sum = sum+cardPoints[i];
maxSum+=cardPoints[i];
}
minSum = sum;
for(int i=len; i<n; ++i){
sum = sum+cardPoints[i]-cardPoints[i-len];
minSum = min(minSum, sum);
}
return maxSum-minSum;
}
};