有 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 }