leetcode力扣刷题打卡
题目:1423. 可获得的最大点数
描述:几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
思路:
1、滑动窗口问题;
2、只取两边的数字,那剩下的部分还是一个连续的数组,依旧可以用滑动窗口解决;
3、求出滑动窗口总和的最小值,那么剩下的就是两头要拿的最大值了。
原代码##
class Solution {
public:
int maxScore(vector<int>& cardPoints, int k) {
int n = cardPoints.size();
int winsize = n - k;
int winsum = 0;
for (int i = 0; i < winsize; ++i) {
winsum += cardPoints[i];
}
int minwin = winsum;
for (int i = winsize; i < n; ++i) {
winsum += cardPoints[i] - cardPoints[i - winsize];
minwin = min(minwin, winsum);
}
int sum = accumulate(cardPoints.begin(), cardPoints.end(), 0);
return sum - minwin;
}
};
总结:
1、刚看到题目还不知道怎么做,换个思路就很简单了;
2、滑动窗口的另一种套路。