当前位置: 首页 > article >正文

【Leetcode 每日一题】1561. 你可以获得的最大硬币数目

问题背景

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

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

数据约束

  • 3 ≤ p i l e s . l e n g t h ≤ 1 0 5 3 \le piles.length \le 10 ^ 5 3piles.length105
  • p i l e s . l e n g t h % 3 = 0 piles.length \% 3 = 0 piles.length%3=0
  • 1 ≤ p i l e s [ i ] ≤ 1 0 4 1 \le piles[i] \le 10 ^ 4 1piles[i]104

解题过程

一个显而易见的方法,是排序之后从较大的三分之二元素中,跳着取值。
这题的数据范围不大,可以用 计数排序 或类似的思想将时间复杂度优化到 O ( N ) O(N) O(N) 这个量级。

具体实现

调用 API

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

计数排序

class Solution {
    public int maxCoins(int[] piles) {
        int n = piles.length;
        countingSort(piles);
        int res = 0;
        for (int i = n / 3; i < n; i += 2) {
            res += piles[i];
        }
        return res;
    }

    private void countingSort(int[] nums) {
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (int num : nums) {
            min = Math.min(min, num);
            max = Math.max(max, num);
        }
        int range = max - min + 1;
        int[] count = new int[range];
        for (int num : nums) {
            count[num - min]++;
        }
        for (int i = 1; i < range; i++) {
            count[i] += count[i - 1];
        }
        int[] res = new int[nums.length];
        for (int i = nums.length - 1; i >= 0; i--) {
            int cur = nums[i];
            res[--count[cur - min]] = cur;
        }
        System.arraycopy(res, 0, nums, 0, nums.length);
    }
}

http://www.kler.cn/a/514799.html

相关文章:

  • PostgreSQL数据库的运行机制和架构体系
  • 微服务学习-Gateway 统一微服务入口
  • 1/20赛后总结
  • 2025年入职/转行网络安全,该如何规划?网络安全职业规划
  • 04JavaWeb——Maven-SpringBootWeb入门
  • 基于STM32的智能门锁安防系统(开源)
  • 数据库事务详解
  • 分支与循环(下)
  • 汽车制造行业案例 | 发动机在制造品管理全解析(附解决方案模板)
  • fastapi 博客系统模型分析
  • 考研408笔记之数据结构(六)——查找
  • go语言gui窗口应用之fyne框架-动态添加、删除一行控件(逐行注释)
  • Django的models.model如何使用
  • LoRA面试篇
  • AIGC浪潮下,图文内容社区数据指标体系如何构建?
  • nodeJS 系统学习(package-包-章节2)
  • 2025牛客寒假算法营1
  • C++并发编程之线程中断异常的捕捉与信息显示
  • Groovy语言的安全开发
  • PAT甲级-1014 Waiting in Line
  • 【软件】解决奥林巴斯生物显微镜软件OlyVIA提示“不支持您使用的操作系统”安装中止的问题
  • 【思科】NAT配置
  • macos app签名和公证
  • PHP教育系统小程序
  • Python网络自动化运维---用户交互模块
  • Vue3组件重构实战:从Geeker-Admin拆解DataTable的最佳实践