题目大意:
你可以获得的最大硬币数目
有 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
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1561
解题思路分析:
这道题需要使用到贪心思路,因为爱丽丝会拿走最多的那部分,因此无论如何当前剩余最多的那部分是无法归我们所有的,这样我们只能争取第二多的部分。但题目中还有一个鲍勃,他还会拿走第三多的那一堆,这是本题的关键,虽然我们无法改变爱丽丝的取值,但鲍勃还是在我们控制范围内的,每次尝试让他拿走最少的一堆才是最优方案。因此,当前轮中,我们挑出的三堆硬币应该是当前剩余中最多,次多,和最少的三堆,其中次多那堆为我们能拿到的硬币。
解题时,我们将由大到小数组排序,数组后三分之一为鲍勃所得,前三分之二为爱丽丝与我的部分,由于爱丽丝每次要拿走最多的那部分,因此,下标0,2,4。。。。部分为爱丽丝所得,剩下的下标为1,3,5。。。的部分为我所得。
实现代码:
public int maxCoins(int[] piles) { Arrays.sort(piles); // 排序数组,有小到大 int times=piles.length/3; // 轮数 int index=piles.length-2; // 第二多所在的下标 int res=0; // 返回结果 for(int i=1;i<=times;i++){ // 循环times轮 res+=piles[index]; // 累加属于我的硬币 index-=2; // 下标减2 } return res; }
本题解法执行时间为24ms。
Runtime: 24 ms, faster than 100.00% of Java online submissions for Maximum Number of Coins You Can Get.
Memory Usage: 48.9 MB, less than 100.00% of Java online submissions for Maximum Number of Coins You Can Get.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1561-maximum-number-of-coins-you-can-get-解题思路分析/