LeedCode刷题:1561.你可以获得的最大硬币数(贪心+双指针)

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

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

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

解题思路:既然Alice取最大无法控制,但可以尽全力剥削Bob,即每次都让Bob取数组中的最小值,Alice和我每次取数组中的相对最大值和相对第二大值

贪心法+双指针,每次都拿当前最大的三堆中的第二大的硬币数,则最终硬币数最多

定义两个指针i和j来控制Bob 和 我、Alice,i初始化为0,j初始化为length-1

所以将数组排序,我和Alice从最后面开始取,Alice取最后一个(第一大),我取Alice前一个(第二大),Bob取第一个(最小)

i每次加一,j每次减二,代码:

 1 class Solution {
 2     public int maxCoins(int[] piles) {
 3         Arrays.sort(piles);//排序
 4         int res=0;
 5         int i=0,j=piles.length-1;//初始指向
 6         while(i<j){
 7             res+=piles[j-1];//我取得的硬币数
 8             i++;//Bob的取值位+1
 9             j-=2;//我和Alice的取值位每次减2
10         }
11         return res;
12     }
13 }

 

posted @ 2020-08-25 01:23  nilbook  阅读(257)  评论(0编辑  收藏  举报