1423. 可获得的最大点数
思路
滑动窗口
逆向思维,记数组 $cardPoints$ 的长度为 $n$,由于只能从开头和末尾拿 $k$ 张卡牌,所以最后剩下的必然是连续的 $n-k$ 张卡牌。
我们可以通过求出剩余卡牌点数之和的最小值,来求出拿走卡牌点数之和的最大值。
算法
由于剩余卡牌是连续的,使用一个固定长度为 $n-k$ 的滑动窗口对数组 $cardPoints$ 进行遍历,求出滑动窗口最小值,然后用所有卡牌的点数之和减去该最小值,即得到了拿走卡牌点数之和的最大值。
拓展
- accumulate函数
 int sum = accumulate(cardPoints.begin(), cardPoints.begin() + windowSize, 0);
代码
滑动窗口
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | class Solution {public:
 int maxScore(vector<int>& cardPoints, int k) {
 int n = cardPoints.size();
 
 int windowSize = n - k;
 
 int sum = accumulate(cardPoints.begin(), cardPoints.begin() + windowSize, 0);
 int minSum = sum;
 for (int i = windowSize; i < n; i++) {
 
 sum += cardPoints[i] - cardPoints[i - windowSize];
 minSum = min(minSum, sum);
 }
 return accumulate(cardPoints.begin(), cardPoints.end(), 0) - minSum;
 }
 };
 
 |