题目描述:
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
示例:
输入:cardPoints=[2,2,2] , k=2
输出:4
解释:无论你拿起哪两张卡牌,可获得的点数总是4
输入:cardPoints=[9,7,7,9,7,7,9] , k=7
输出:55
解释:你必须拿起所有卡牌,可以获得的点数为所有卡牌的点数之和
输入:cardPoints=[1,79,80,1,1,1,200,1] , k=3
输出:202
解释:
综合解法(JS实现):
解法一(普通大众解法):
var cards=[4,6,8,,2,4,5,9]; //数字卡 var pickCards=3; //要拿的卡数 var pickCardsMaxSum=0; //拿到的卡数的最大值 for(let i=0; i<pickCards; i++){ if(cards[0] >= cards[cards.length-1]){ pickCardsMaxSum+=cards[0] ; cards.shift(); }else{ pickCardsMaxSum+=cards[cards.length-1]; cards.pop(); } } console.log('输出拿到卡数的最大值:',pickCardsMaxSum);
解法二(滑动窗口解法):
//思想是:所有数字之和-最小的滑动窗口值和=最大值和
var cards=[9,7,7,9,7,7,9]; //所有的数字卡
var allCardsSum=0; //所有卡的数字和
var pickCards=7; //拿的卡数
var windowMinSum=0; //移动窗口的最小值
var windowSize=cards.length-pickCards; //移动窗口的大小
var sum=0; //移动窗口的值
//得到所有的数字卡和
for(let i=0;i<cards.length;i++){
allCardsSum+=cards[i];
}
//初始化窗口的最小和值
for(let i=0;i<windowSize;i++){
windowMinSum+=cards[i];
}
sum=windowMinSum;
for(let s=windowSize;s<cards.length;s++){
sum+=cards[s]-cards[s-windowSize];
windowMinSum=Math.min(sum,windowMinSum);
}
var res=allCardsSum-windowMinSum;
console.log('得到的最大和值‘,res);
总结:上面解法没有考虑到某些情况,因为相对于滑动窗口的解题思想来说我其余的情况没有诱惑力;
刷题不在于多少在于你吸收了多少,刚开始入手慢随着积累慢慢的就可以提速了;
一步一个脚印!!!继续加油
版权声明:本文为博主原创文章,如需转载,请标明出处。