首页 > 其他分享 >力扣---1561. 你可以获得的最大硬币数目

力扣---1561. 你可以获得的最大硬币数目

时间:2023-01-18 11:46:45浏览次数:51  
标签:力扣 piles 硬币 int res Alice --- 1561 Bob

有 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-number-of-coins-you-can-get
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

使用贪心的思路,即每次Bob取最小的,你和Alice分最大的两堆。

可以利用双指针来判断。

代码如下:

class Solution {
    public int maxCoins(int[] piles) {
        Arrays.sort(piles);
        // 左指针
        int p1 = 0;
        // 右指针
        int p2 = piles.length - 1;
        // 答案
        int res = 0;
        while (p1 < p2) {
            // 取最大的两堆中较小的那堆
            res += piles[p2 - 1];
            p2 -= 2;
            p1 += 1;
        }
        return res;
    }
}

运行结果:

运行结果01

 

优化一下,发现可以把左指针省略

代码如下:

class Solution {
    public int maxCoins(int[] piles) {
        Arrays.sort(piles);
        int res = 0;
        for (int i = piles.length - 2; i >= piles.length / 3; i -= 2) {
            res += piles[i];
        }
        return res;
    }
}

运行结果:

优化左指针

 

标签:力扣,piles,硬币,int,res,Alice,---,1561,Bob
From: https://www.cnblogs.com/allWu/p/17059476.html

相关文章

  • Java 集合 - 精简版
    Java集合1.Collection1.List1.ArrayList存储有序有索引元素可重复底层是Object数组查询快,增删慢2.LinkedList存储有序无索引元素可重复底层是......
  • minio-docker
    docker安装启动minio用最新版的minio总感觉有问题推荐使用dockerpullminio/minio下面的演示都是用的这个无法连接外网安装启动dockersearchminio/minio#搜不......
  • 特定领域知识图谱(Domain-specific KnowledgeGraph:DKG)融合方案:技术知识前置【一】-
    特定领域知识图谱(Domain-specificKnowledgeGraph:DKG)融合方案:技术知识前置【一】-文本匹配算法、知识融合学术界方案、知识融合业界落地方案、算法测评KG生产质量保障0......
  • JavaWeb-Request&Response
    JavaWeb-Request&Response1,Request和Response的概述Request是请求对象,Response是响应对象。这两个对象在我们使用Servlet的时候有看到:此时,我们就需要思考一个问题reques......
  • FMC子卡设计资料原理图:FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡
    FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡   一、产品概述  ADRV9002 是一款高性能、高线性度、高动态范围收发器,旨在针对性能与功耗系......
  • 【2023-01-17】销售工作
    20:00我逐渐确信人际关系中的真实、诚信、正直对于人生的幸福至关重要。                              ......
  • 学习笔记——AOP-代理模式
    2023-01-18一、AOP前奏-代理模式1、手动实现动态代理环境搭建(1)基于接口实现动态代理:JDK动态代理(2)基于继承实现动态代理:Cglib、javassist动态代理2、实现动态代理的步......
  • CAM系列(二)之Grad-CAM(原理讲解和代码实现)zz
    上篇文章介绍了CAM的开篇之作CAM系列(一)之CAM(原理讲解和PyTorch代码实现),本篇接着介绍泛化性和通用性能更好的Grad-CAM。Grad-CAM的提出背景:CAM揭示了卷积神经网络分类模......
  • PYNQ-Z2启动NutShell(果壳处理器)——修正官方文档错误
    Compilechiselcode这里是英文版,之后会编写一个中文beforestart,gitcheckoutrelease-21228Installmill.RefertotheManualsectioninthisguide.Run......
  • 【ES HTTP-增删改成 01】
    一、数据存储:结构化数据,一般会用二维的表结构来存储,如:mysql等关系型数据库非结构化数据,即无法用关系型数据库存储的数据,如:日志、通讯记录、报表、视频、图片等,一般会把......