肇庆网站建设公司哪个好,深圳十大建筑设计公司,上海珍岛网站建设,想百度搜到网站新域名怎么做1423. 可获得的最大点数
几张卡牌 排成一行#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动#xff0c;你可以从行的开头或者末尾拿一张卡牌#xff0c;最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你…1423. 可获得的最大点数
几张卡牌 排成一行每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动你可以从行的开头或者末尾拿一张卡牌最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k请你返回可以获得的最大点数。
示例 1
输入cardPoints [1,2,3,4,5,6,1], k 3
输出12
解释第一次行动不管拿哪张牌你的点数总是 1 。但是先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌最终点数为 1 6 5 12 。
示例 2
输入cardPoints [2,2,2], k 2
输出4
解释无论你拿起哪两张卡牌可获得的点数总是 4 。
示例 3
输入cardPoints [9,7,7,9,7,7,9], k 7
输出55
解释你必须拿起所有卡牌可以获得的点数为所有卡牌的点数之和。
示例 4
输入cardPoints [1,1000,1], k 1
输出1
解释你无法拿到中间那张卡牌所以可以获得的最大点数为 1 。
示例 5
输入cardPoints [1,79,80,1,1,1,200,1], k 3
输出202
题解及分析:
做差比较法
由于每次只能从头或尾取卡牌最后共k张意味着如果卡牌较多不一定会比较了所有卡牌
换言之就是每次将头尾比较然后取出较大的一个
解题思路先计算前K个卡牌和假设全部都是头这一端大)
然后遍历计算最后一张与第k张的大小即将假设的最后一张与真实的最后一张进行比较如果全部都更换了也就回到了上面所说的每次将头尾俩段较大的取出然后更新答案
本质将头尾共计2k张牌进行选择每次取较大的出来
更新方法
举例countcarpoints[-1]-carpoints[k-1]
加上对应的差值并与之前的ans对比取更大的作为ans(肯定会存在尾端卡牌小于首段情况即负值)
class Solution(object):def maxScore(self, cardPoints, k)::type cardPoints: List[int]:type k: int:rtype: int# 记录前k张牌和anscountsum(cardPoints[:k])# 遍历比较尾端卡牌for i in range(1,k1): # 从1开始是方便 列表[-1] 即最后一个元素取出countcardPoints[-i]-cardPoints[k-i]ansmax(ans,count)return ans