滑动窗口
class Solution {
public int maxScore(int[] cardPoints, int k) {
// 使用滑动窗口,寻找连续的,长度为cardPoints.length-k的,且和最小的子数组
// 剩下的元素的和即为题目所求的maximum score
int total = 0;
for (int value: cardPoints) {
total += value;
}
// 初始化左右指针和sum值
int left = 0, right = cardPoints.length - k - 1;
int sum = 0, minSum = 0;
for (int i = left; i <= right; ++i) {
sum += cardPoints[i];
}
minSum = sum;
// 移动窗口,维护minSum
while (right < cardPoints.length - 1) {
sum += cardPoints[++right];
sum -= cardPoints[left++];
minSum = Math.min(sum, minSum);
}
return total - minSum;
}
}