我们可以换个角度来思考:当我们取出k个数字后,剩余的 len - k 个数字是不是一个连续的数组?如果我们求出连续数组的最小值,是不是相当于取出的数字和最大
所以,我们将这个问题转化为给定一个数组,我们求在一段区间内的最小值
使用滑动窗口进行解决
3. 代码分析
classSolution{publicintmaxScore(int[] cardPoints,int k){// 获取cardPoints的长度int len = cardPoints.length;int sum =0;// 求出cardPoints的总值for(int i =0; i < len; i++){
sum += cardPoints[i];}// 如果我们选取的卡牌数量大于我们的卡牌数量,则直接返回总值即可if(k >= len){return sum;}int sumSmall =0;// 求出最原始的滑动窗口的值 [0,len-k)for(int i =0; i < len - k; i++){
sumSmall += cardPoints[i];}// 标记滑动窗口的大小int left =0;int right = len - k;int min = sumSmall;// 每一次滑动都要加上右边的值,减去左边的值while(right < len){
sumSmall += cardPoints[right++];
sumSmall -= cardPoints[left++];
min = Math.min(min, sumSmall);}// 最后返回总值减去最小值即可return sum - min;}}