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()
:为计算数组所有元素之和