1423.可获得的最大点数
思路:
数组cardPoints的长度为n,由于只能从开头和末尾拿k张卡牌,所以最后剩下的必然是连续的n-k张卡牌,可以通过求出剩余卡牌点数之和的最小值,来求出拿走卡牌点数之和的最大值
算法:
由于剩余卡牌是连续的,使用一个固定长度为n-k的滑动窗口对数组cardPoints进行遍历,求出滑动窗口最小值,然后用所有卡牌的点数之和减去该最小值,即得到了拿走卡牌点数之和的最大值
class Solution {
public int maxScore(int[] cardPoints, int k) {
//使用滑动窗口进行计算
int n = cardPoints.length,sum = 0;
int windows = n - k;
//计算第一个窗口的和
for(int i = 0; i < windows;i++){
sum += cardPoints[i];
}
int minSum = sum;
for(int i = windows;i<n;i++){
sum = sum + cardPoints[i] - cardPoints[i - windows];
minSum = Math.min(minSum,sum);
}
//计算数组所有元素之和-窗口内最小值=做大点数
return Arrays.stream(cardPoints).sum() - minSum;
}
}
注意:
Arrays.stream(cardPoints).sum()
:为计算数组所有元素之和