可获得的最大点数
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
题解:
滑动窗口:
由题可知,首先想到每次拿开头或者结尾,选择到最大的点数,就有点头疼了 因为不知道拿开头或者结尾,每次拿的地方不固定,那我们就找一个固定的, 固定的就是剩下的长度一定是len-k,每次从开头或者结尾拿我们不管,
但是确定的是一定会剩下一个连续的子数组,题目要求是找到最大的点数, 那么我们就需要挑出其中最小的连续子数组即可
public class maxScore {
public static int maxScore(int[] cardPoints,int k){
int len=cardPoints.length;
int sum=0;
for (int i=0;i<cardPoints.length;i++){
sum+=cardPoints[i];
}
int lenght=len-k;
int min=Integer.MAX_VALUE;
int temp=0;
for (int i=0;i<cardPoints.length;i++){
temp+=cardPoints[i];
if (i>=lenght){
temp-=cardPoints[lenght-i];
}
if (i>=lenght-1){
min=Math.min(min,temp);
}
}
return sum-min;
}
}