本文主要是介绍2023.12.3 每日一题 最大点数 很巧秒的做法,数学思维的开拓,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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张牌,进行选择,每次取较大的出来) 更新方法: 举例:count+=carpoints[-1]-carpoints[k-1] 加上对应的差值,并与之前的ans对比取更大的作为ans(肯定会存在尾端卡牌小于首段情况即负值)
class Solution(object):def maxScore(self, cardPoints, k):""":type cardPoints: List[int]:type k: int:rtype: int"""# 记录前k张牌和ans=count=sum(cardPoints[:k])# 遍历比较尾端卡牌for i in range(1,k+1): # 从1开始是方便 列表[-1] 即最后一个元素取出count+=cardPoints[-i]-cardPoints[k-i]ans=max(ans,count)return ans
这篇关于2023.12.3 每日一题 最大点数 很巧秒的做法,数学思维的开拓的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!