力扣 1423 :可获得的最大点数

题目描述:

  几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 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); 
总结:上面解法没有考虑到某些情况,因为相对于滑动窗口的解题思想来说我其余的情况没有诱惑力;
   刷题不在于多少在于你吸收了多少,刚开始入手慢随着积累慢慢的就可以提速了;
   一步一个脚印!!!继续加油

版权声明:本文为博主原创文章,如需转载,请标明出处。
posted @ 2021-03-26 16:34  gamecc666  阅读(60)  评论(0编辑  收藏  举报