【每日一题Day351】LC2530执行 K 次操作后的最大分数 | 原地堆化

简介: 【每日一题Day351】LC2530执行 K 次操作后的最大分数 | 原地堆化

执行 K 次操作后的最大分数【LC2530】

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。

在一步 操作 中:

选出一个满足 0 <= i < nums.length 的下标 i ,

将你的 分数 增加 nums[i] ,并且

将 nums[i] 替换为 ceil(nums[i] / 3) 。

返回在 恰好 执行 k 次操作后,你可能获得的最大分数。

向上取整函数 ceil(val) 的结果是大于或等于 val 的最小整数。

学到了

大顶堆+贪心
  • 思路
  • 每次操作尽量选择数组中的最大值,以获得最大分数
  • 借助大顶堆存储数组元素,那么堆顶元素为每次操作的元素,每次操作完成后将ceil(num/3)放入堆中,向上取整的实现有以下三种
  • 调用API:Math.ceil(num/3.0)
  • 判断余数是否为0:num / 3 + (num % 3 == 0 ? 0 : 1)
  • 加2后再进行整除:(num + 2) / 3
  • 实现
class Solution {
    public long maxKelements(int[] nums, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> o2 - o1);   
        long res = 0L;
        for (int num : nums){
            pq.add(num);
        }
        for (int i = 0; i < k; i++){
            int num = pq.poll();
            res += num;
            // pq.add(num / 3 + (num % 3 == 0 ? 0 : 1));
            pq.add((num + 2) / 3);
            pq.add((int)Math.ceil(num / 3.0));
        }
        return res;
    }
}

复杂度

时间复杂度:O ( n + k l o g n )

空间复杂度:O ( n )

image.png

实现

class Solution {
    public long maxKelements(int[] nums, int k) {
        heapify(nums); // 原地堆化(最大堆)
        long ans = 0;
        while (k-- > 0) {
            ans += nums[0]; // 堆顶
            nums[0] = (nums[0] + 2) / 3;
            sink(nums, 0); // 堆化(只需要把 nums[0] 下沉)
        }
        return ans;
    }
    // 原地堆化(最大堆)
    // 堆化可以保证 h[0] 是堆顶元素,且 h[i] >= max(h[2*i+1], h[2*i+2])
    private void heapify(int[] h) {
        // 下标 >= h.length / 2 的元素是二叉树的叶子,无需下沉
        // 倒着遍历,从而保证 i 的左右子树一定是堆,那么 sink(h, i) 就可以把左右子树合并成一个堆
        for (int i = h.length / 2 - 1; i >= 0; i--) {
            sink(h, i);
        }
    }
    // 把 h[i] 不断下沉,直到 i 的左右儿子都 <= h[i]
    private void sink(int[] h, int i) {
        int n = h.length;
        while (2 * i + 1 < n) {
            int j = 2 * i + 1; // i 的左儿子
            if (j + 1 < n && h[j + 1] > h[j]) { // i 的右儿子比 i 的左儿子大
                j++;
            }
            if (h[j] <= h[i]) { // 说明 i 的左右儿子都 <= h[i],停止下沉
                break;
            }
            swap(h, i, j); // 下沉
            i = j;
        }
    }
    // 交换 h[i] 和 h[j]
    private void swap(int[] h, int i, int j) {
        int tmp = h[i];
        h[i] = h[j];
        h[j] = tmp;
    }
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/maximal-score-after-applying-k-operations/solutions/2487446/o1-kong-jian-zuo-fa-pythonjavacgojsrust-ztx6f/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度

时间复杂度:O ( n + k l o g n )

空间复杂度:O ( 1 )

目录
相关文章
|
5月前
|
存储 数据库 Python
使用HTTP POST协议将本地压缩数据发送到服务器
总的来说,使用HTTP POST协议将本地压缩数据发送到服务器是一个涉及多个步骤的过程,包括创建压缩文件,设置HTTP客户端,发送POST请求,以及服务器端的处理。虽然这个过程可能看起来复杂,但一旦你理解了每个步骤,就会变得相对简单。
219 19
|
7月前
|
机器学习/深度学习 测试技术 API
QwQ-32B开源!更小尺寸,仅1/20参数性能比肩满血R1
今天,通义千问开源了推理模型QwQ-32B
702 17
|
8月前
|
存储 人工智能 自然语言处理
NoteGen:看看使用DeepSeek能力的开源项目有多牛,平替TyporaAI笔记应用
NoteGen 是一款基于 Tauri 开发的跨端 AI 笔记应用,支持 Mac、Windows 和 Linux。它利用多种 AI 模型(如 ChatGPT、DeepSeek 等)帮助用户高效记录、整理和创作。核心功能包括截图识别、文本记录、插图插入、智能标签管理及剪贴板识别。NoteGen 还提供强大的 Markdown 编辑器、AI 辅助写作、文件同步与版本控制等功能,极大提升了知识管理效率。项目开源,平替 Typora AI 笔记应用。
803 11
|
传感器 机器学习/深度学习 数据采集
AI在环保中的角色:污染监测与防治
【10月更文挑战第6天】AI在环保领域的应用,不仅提升了污染监测的精准度和防治效率,还推动了环保技术的创新和升级。作为未来环保事业的重要力量,AI正以其独特的优势,为构建更加绿色、可持续的生态环境贡献着智慧与力量。我们有理由相信,在AI的助力下,我们的地球将变得更加美好。
|
存储 小程序 中间件
单片机中MCU跑RTOS相比裸机的优势
单片机中MCU跑RTOS相比裸机的优势
311 1
|
存储 Linux 应用服务中间件
VMware安装无GUI版本的Linux(CentOS7)——安装Nginx示例demo
VMware安装无GUI版本的Linux(CentOS7)——安装Nginx示例demo
351 1
|
Ubuntu Linux Docker
使用Docker进行容器化:从零开始的技术博文
【8月更文挑战第16天】从零开始掌握Docker容器化技术:本文详细介绍Docker基本概念、安装配置流程及核心组件。涵盖Docker镜像与容器管理、镜像加速配置,以及如何利用Dockerfile自动化构建镜像,助您快速入门并高效运用Docker进行软件开发与部署。
|
机器学习/深度学习 人工智能 搜索推荐
Sora复现项目Mora发布
Lehigh大学LAIR实验室推出Mora项目,旨在复现并超越OpenAI的Sora视频生成模型。Mora采用多智能体框架,通过协同工作实现文本到视频的转换,打破了视频生成技术的闭源限制。利用GPT-4和先进视频模型,Mora在视频生成、编辑和内容创作上展现强大潜力,已在多个任务中超越开源模型。然而,面临视频数据集版权、生成质量与长度、复杂指令遵循等挑战。
214 2
Sora复现项目Mora发布
|
安全 网络安全 区块链
开发一款数藏平台需要哪些资质
开发一款数藏平台需要哪些资质
1140 5