X

LEETCODE 1561. Maximum Number of Coins You Can Get 解题思路分析

题目大意:

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

有 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-解题思路分析/
Categories: leetcode
kwantong: