题目来源
思路
滑动窗口
由于每次只能拿开头和结尾的牌,所以最后剩下的必然是连续的n-k
张牌。可以用滑动窗口的方法来求解中间连续的牌的最小值,然后利用一开始的总和减去剩余卡牌的点数之和的最小值,得出拿走的卡牌的点数之和的最大值。
代码
class Solution {
public int maxScore(int[] cardPoints, int k) {
int n = cardPoints.length;
// 滑动窗口大小为 n-k
int windowSize = n - k;
// 选前 n-k 个作为初始值
int sum = 0;
for (int i = 0; i < windowSize; ++i) {
sum += cardPoints[i];
}
int minSum = sum;
for (int i = windowSize; i < n; ++i) {
// 滑动窗口每向右移动一格,增加从右侧进入窗口的元素值,并减少从左侧离开窗口的元素值
sum += cardPoints[i] - cardPoints[i - windowSize];
minSum = Math.min(minSum, sum);
}
return Arrays.stream(cardPoints).sum() - minSum;
}
}
作者:LeetCode-Solution
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
补充
也可以用前缀和解。通过前缀和求出任意区间[i,j]
之间的和,即取完牌后剩下牌的点数之和。