azl397985856/leetcode

【每日一题】- 2020-09-01 - 1561. 你可以获得的最大硬币数目

azl397985856 opened this issue · 2 comments

有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币:

每一轮中,你将会选出 任意 3 堆硬币(不一定连续)。
Alice 将会取走硬币数量最多的那一堆。
你将会取走硬币数量第二多的那一堆。
Bob 将会取走最后一堆。
重复这个过程,直到没有更多硬币。
给你一个整数数组 piles ,其中 piles[i] 是第 i 堆中硬币的数目。

返回你可以获得的最大硬币数目。

 

示例 1:

输入:piles = [2,4,1,2,7,8]
输出:9
解释:选出 (2, 7, 8) ,Alice 取走 8 枚硬币的那堆,你取走 7 枚硬币的那堆,Bob 取走最后一堆。
选出 (1, 2, 4) , Alice 取走 4 枚硬币的那堆,你取走 2 枚硬币的那堆,Bob 取走最后一堆。
你可以获得的最大硬币数目:7 + 2 = 9.
考虑另外一种情况,如果选出的是 (1, 2, 8) 和 (2, 4, 7) ,你就只能得到 2 + 4 = 6 枚硬币,这不是最优解。
示例 2:

输入:piles = [2,4,5]
输出:4
示例 3:

输入:piles = [9,8,7,6,5,1,2,3,4]
输出:18
 

提示:

3 <= piles.length <= 10^5
piles.length % 3 == 0
1 <= piles[i] <= 10^4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-coins-you-can-get
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

由于第三个人每次都取最小的,因此我们的目标是第三个人取的总和最小,这样第一个和第二个取的总和才最大。

因此本题可以抽象为重复在一个数组中找两个数,是的其差的绝对值总和最小,直到数组中的数字都被取出

只需要先数组倒序排序,然后每次取次大值,将最大值留给第一个人即可。

代码(Python)

class Solution:
    def maxCoins(self, piles: List[int]) -> int:
        piles.sort()
        ans = 0
        for i in range(len(piles) - 2, -1, -2):
            ans += piles[i]
            if i <= len(piles) // 3: return ans
        return 0

复杂度分析

  • 时间复杂度:$O(NlogN)$
  • 空间复杂度:$O(1)$ 到 $O(N)$,取决于排序算法的实现。

更多题解可以访问我的LeetCode题解仓库:https://github.com/azl397985856/leetcode 。 目前已经35K star啦。

关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。

stale commented

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.