1423. 可获得的最大点数

这篇博客讨论了一个中等难度的算法问题——如何在给定数组中选择k个元素以获得最大点数。作者提供了三个不同的解决方案,分别针对数组长度等于k、小于k的情况。第一版代码直接计算所有可能的k个元素组合,但超出了时间限制。第二版代码通过维护一个窗口,减少了计算次数。第三版代码考虑了特殊情况,即数组长度等于k时直接求和。博客探讨了算法优化和效率提升,适合对算法感兴趣的读者。
摘要由CSDN通过智能技术生成

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
解释:你必须拿起所有卡牌,可以获得的点数为所有卡牌的点数之和。

 第一版代码(先取最后的K个数作为最初的结果, 然后每次向后移动一位, 同时从最前面取一个数字, 依次进行, 直到取的是最前面得K个数字, 其中最大的数组和就是结果)

class Solution:
    def maxScore(self, cardPoints: List[int], k: int) -> int:
        res = sum(cardPoints[-k:])
        for i in range(1, k + 1):
            if i == k:
                li = cardPoints[:i]
            else:
                li = cardPoints[:i] + cardPoints[-(k-i):]
            tem = sum(li)
            if tem > res:
                res = tem
        return res

结果直接超出了时间限制, 因为每次都在求K个元素的和, 比较耗时

第二版代码(可以简化为取数组最后的K个数字,和取数据最前的K个数字组成新的数组, 从中选取最大的K的子串,这次每次移动的时候就是减一个数字, 加一个数字, 不用每次都求和)

class Solution:
    def maxScore(self, cardPoints: List[int], k: int) -> int:
        li = cardPoints[-k:] + cardPoints[:k]
        res = temp = sum(li[:k])
        left, right = 1, k
        while right < 2*k:
            temp = temp - li[left - 1] + li[right]
            if temp > res:
                res = temp
            right += 1
            left += 1
        return res

结果还不错

第三版代码(我们再考虑一下特殊情况, 就是当数组的长度就是K的时候, 我们直接求和即可)

class Solution:
    def maxScore(self, cardPoints: List[int], k: int) -> int:
        if k == len(cardPoints):
            return sum(cardPoints)
            
        li = cardPoints[-k:] + cardPoints[:k]
        res = temp = sum(li[:k])
        left, right = 1, k
        while right < 2 * k:
            temp = temp - li[left - 1] + li[right]
            if temp > res:
                res = temp
            right += 1
            left += 1
        return res

 

### 回答1: 假设导联数据存储在一个列表中,可以分别定义以下函数/模块来取出各导联中数据的最大值、最小值、平均值和数据总点数: ```python def get_max(data): return max(data) def get_min(data): return min(data) def get_avg(data): return sum(data) / len(data) def get_total_count(data): return len(data) ``` 其中,参数`data`表示一个导联数据的列表。可以分别调用这些函数/模块来获取不同的统计信息,例如: ```python data_lead1 = [1, 2, 3, 4, 5] max_lead1 = get_max(data_lead1) min_lead1 = get_min(data_lead1) avg_lead1 = get_avg(data_lead1) count_lead1 = get_total_count(data_lead1) data_lead2 = [10, 20, 30, 40, 50] max_lead2 = get_max(data_lead2) min_lead2 = get_min(data_lead2) avg_lead2 = get_avg(data_lead2) count_lead2 = get_total_count(data_lead2) ``` 这样就可以分别获取两个导联数据中的最大值、最小值、平均值和数据总点数了。 ### 回答2: 采用函数/模块定义,取出各导联中数据最大值、最小值、平均值、数据总点数的方法如下: 1. 首先,我们可以定义一个函数或者模块来处理导联数据。 2. 在函数或模块中,我们可以传入导联数据作为参数,并使用相关方法或函数来计算最大值、最小值、平均值和数据总点数。 3. 为了获取最大值,可以使用max()函数来找出导联数据中的最大值。 4. 为了获取最小值,可以使用min()函数来找出导联数据中的最小值。 5. 为了获取平均值,可以使用sum()函数将导联数据求和,然后除以数据总点数(可以通过len()函数获取)。 6. 为了获取数据总点数,可以使用len()函数来计算导联数据的长度。 下面是一个示例函数的代码: ```python def calculate_stats(data): max_value = max(data) min_value = min(data) avg_value = sum(data) / len(data) total_points = len(data) return max_value, min_value, avg_value, total_points # 示例使用方法: lead_data = [1, 2, 3, 4, 5] max_val, min_val, avg_val, total_pts = calculate_stats(lead_data) print("导联数据的最大值是:", max_val) print("导联数据的最小值是:", min_val) print("导联数据的平均值是:", avg_val) print("导联数据的总点数是:", total_pts) ``` 以上代码将会输出以下结果: 导联数据的最大值是: 5 导联数据的最小值是: 1 导联数据的平均值是: 3.0 导联数据的总点数是: 5 ### 回答3: 要通过函数/模块定义来取出各导联中数据的最大值、最小值、平均值和数据总点数,可以按照以下步骤进行: 首先,我们可以创建一个函数来计算最大值。在这个函数中,我们接收一个包含数据的列表作为输入参数,并使用Python内置的max()函数来找到列表中的最大值。然后,返回这个最大值作为函数的结果。 其次,我们可以创建另一个函数来计算最小值。这个函数与计算最大值的函数类似,但使用min()函数来找到列表中的最小值。 接下来,我们可以定义一个函数来计算平均值。在这个函数中,我们接收一个包含数据的列表作为输入参数,并使用sum()函数来计算列表中所有数据的总和。然后,将总和除以列表的长度来得到平均值,并返回这个平均值作为函数的结果。 最后,我们可以创建一个函数来计算数据的总点数。在这个函数中,我们接收一个包含数据的列表作为输入参数,并使用len()函数来计算列表的长度。然后,返回这个长度作为函数的结果。 通过以上的函数定义,我们可以在程序的其他部分通过调用这些函数来获取各导联中数据的最大值、最小值、平均值和数据总点数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值