题目描述:
个人理解:
可以动态的判断首元素和尾元素的大小,在获得点数后,把该元素从数组中删除。也可以计算剩余点数最小,则被拿走的就是最大的点数。如果选择k个元素,则剩余的元素就是n-k个,n为数组大小。则可以采用滑动窗口从下标0->(k-1)一直到k-1->n-1。
代码:
/**
* ClassName:TestDemo
* Package:Work1423
* Description:
*几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
*
* 每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
*
* 你的点数就是你拿到手中的所有卡牌的点数之和。
*
* 给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
* @date:2022/2/19 20:22
* @author:HDLaZy
*/
public class TestDemo {
public static void main(String[] args) {
int [] a=new int[]{100,40,17,9,73,75};
Solution solution=new Solution();
int i = solution.maxScore(a, 3);
System.out.println(i);
}
}
class Solution {
public int maxScore(int[] cardPoints, int k) {
int n=cardPoints.length;
int windowSize=n-k;
int sum=0;
for(int i=0;i<windowSize;++i){
sum+=cardPoints[i];
}
int minSum=sum;
for(int i=windowSize;i<n;++i){
sum+=cardPoints[i]-cardPoints[i-windowSize];
minSum=Math.min(minSum, sum);
}
return Arrays.stream(cardPoints).sum()-minSum;
}
}