1. 问题描述:
有 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
2. 思路分析:
① 从题目中可以知道每一次我们都需要选择3堆硬币,我们都是尽可能从剩下的堆中挑选最大的两个,然后将剩下的最小的一个给Alice选择,比如piles = [9,8,7,6,5,1,2,3,4], 尽可能使得我挑选的最大那么第一次的时候需要挑选9,8,1,让Alice最后一次选择最后一堆的时候选择的是剩下堆中最小的那个,第二次也是如此所以应该选择7,6,2,第三次选择5,4,3这样选择之后每一次都是都是选择的是三堆中第二大的那堆那么最后我选择的结果就是最大的,所以基于这个想法我们可以知道piles数组排序之后最小的n个数字肯定被Alice取走了,所以我们需要取走的是piles排序之后2n个中的n个数字,而我们是不能够取连续的n个比较大的数字的,只能取间隔为2的数字才能够使得最后取出的n个数字是最大的
② 想清楚了其实还是比较容易理解的,我们只需要对piles数组进行排序,然后再len(piles) / 3的位置以步长为2累加数组元素值即可,官网题解写的非常清楚了
3. 代码如下:
from typing import List
class Solution:
def maxCoins(self, piles: List[int]) -> int:
piles.sort()
# 切片操作: 从len(piles) // 3位置步长为2开始截取元素
return sum(piles[len(piles) // 3::2])