• 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 }
  • 相关阅读:
    liststyle
    :nthchild(n)
    织梦CMS首页调用分类信息栏目及列表方法
    []织梦CMS首页调用分类信息栏目及列表方法
    ps快捷键
    系统架构博客,很不错
    google maps api 反向解析 地址 api
    sphinx
    sphinx discuss
    ruby分词
  • 原文地址:https://www.cnblogs.com/nilbook/p/13557476.html
Copyright © 2020-2023  润新知