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

LeetCode 3066.超过阈值的最少操作数 II:模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间

【LetMeFly】3066.超过阈值的最少操作数 II:模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间

力扣题目链接:https://leetcode.cn/problems/minimum-operations-to-exceed-threshold-value-ii/

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

一次操作中,你将执行:

  • 选择 nums 中最小的两个整数 x 和 y 。
  • 将 x 和 y 从 nums 中删除。
  • 将 min(x, y) * 2 + max(x, y) 添加到数组中的任意位置。

注意,只有当 nums 至少包含两个元素时,你才可以执行以上操作。

你需要使数组中的所有元素都大于或等于 k ,请你返回需要的 最少 操作次数。

 

示例 1:

输入:nums = [2,11,10,1,3], k = 10
输出:2
解释:第一次操作中,我们删除元素 1 和 2 ,然后添加 1 * 2 + 2 到 nums 中,nums 变为 [4, 11, 10, 3] 。
第二次操作中,我们删除元素 3 和 4 ,然后添加 3 * 2 + 4 到 nums 中,nums 变为 [10, 11, 10] 。
此时,数组中的所有元素都大于等于 10 ,所以我们停止操作。
使数组中所有元素都大于等于 10 需要的最少操作次数为 2 。

示例 2:

输入:nums = [1,1,2,4,9], k = 20
输出:4
解释:第一次操作后,nums 变为 [2, 4, 9, 3] 。
第二次操作后,nums 变为 [7, 4, 9] 。
第三次操作后,nums 变为 [15, 9] 。
第四次操作后,nums 变为 [33] 。
此时,数组中的所有元素都大于等于 20 ,所以我们停止操作。
使数组中所有元素都大于等于 20 需要的最少操作次数为 4 。

 

提示:

  • 2 <= nums.length <= 2 * 105
  • 1 <= nums[i] <= 109
  • 1 <= k <= 109
  • 输入保证答案一定存在,也就是说一定存在一个操作序列使数组中所有元素都大于等于 k

解题方法:小根堆

这道题说明了让你模拟,那咱就模拟。

使用小根堆(堆顶元素最小)。每次从堆中取出两个元素,并将计算结果放回堆中。

这样就保证了每次取出的元素都是当前最小值,直到堆顶元素 ≥ k \geq k k停止。

  • 时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn):原地建堆时间复杂度 O ( n ) O(n) O(n),优先队列(额外建堆)时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn);单次操作时间复杂度 O ( log ⁡ n ) O(\log n) O(logn),操作次数不超过 n n n
  • 空间复杂度:原地建堆 O ( 1 ) O(1) O(1),优先队列(额外建堆) O ( n ) O(n) O(n)

AC代码

C++ - 原地建堆
/** @Author: LetMeFly* @Date: 2025-01-15 13:38:52* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-01-15 13:58:45*/
class Solution {
public:int minOperations(vector<int>& nums, int k) {int ans = 0;make_heap(nums.begin(), nums.end(), greater<>());while (nums[0] < k) {int x = nums[0];pop_heap(nums.begin(), nums.end() - ans, greater<>());int y = nums[0];pop_heap(nums.begin(), nums.end() - (ans + 1), greater<>());nums[nums.size() - ans - 2] = min((unsigned)k, (unsigned)x + (unsigned)y + (unsigned)min(x, y));push_heap(nums.begin(), nums.end() - (ans + 1), greater<>());ans++;}return ans;}
};
  • 执行用时分布120ms击败49.31%;
  • 消耗内存分布83.55MB击败100.00%
Python - 原地建堆
'''
Author: LetMeFly
Date: 2025-01-15 14:02:08
LastEditors: LetMeFly.xyz
LastEditTime: 2025-01-15 14:12:18
'''
from typing import List
import heapqclass Solution:def minOperations(self, nums: List[int], k: int) -> int:ans = 0heapq.heapify(nums)while nums[0] < k:x = nums[0]heapq.heappop(nums)y = nums[0]heapq.heappop(nums)heapq.heappush(nums, 2 * min(x, y) + max(x, y))ans += 1return ansif __name__ == '__main__':sol = Solution()print(sol.minOperations([2, 11, 10, 1, 3], 10))
Java - 优先队列
/** @Author: LetMeFly* @Date: 2025-01-15 14:22:12* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-01-15 14:30:40*/
import java.util.PriorityQueue;class Solution {public int minOperations(int[] nums, int k) {int ans = 0;PriorityQueue<Long> pq = new PriorityQueue<>();for (int t : nums) {pq.add((long)t);}while (pq.peek() < k) {long x = pq.remove(), y = pq.remove();pq.add(Math.min(x, y) * 2 + Math.max(x, y));ans++;}return ans;}
}
Go - 优先队列
/** @Author: LetMeFly* @Date: 2025-01-15 14:37:30* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-01-15 14:53:17*/
package mainimport "container/heap"func minOperations(nums []int, k int) (ans int) {pq := make(heap_MOETV2, 0)heap.Init(&pq)for _, n := range nums {heap.Push(&pq, n)}for ; pq[0] < k; ans++ {x, y := heap.Pop(&pq).(int), heap.Pop(&pq).(int)heap.Push(&pq, x + x + y)}return
}type heap_MOETV2 []intfunc (h heap_MOETV2) Len() int { return len(h) }
func (h heap_MOETV2) Less(i, j int) bool { return h[i] < h[j] }
func (h heap_MOETV2) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *heap_MOETV2) Push(a interface{}) { *h = append(*h, a.(int)) }
func (h *heap_MOETV2) Pop() interface{} { temp := *h; ans := temp[len(temp) - 1]; (*h) = temp[0:len(temp) - 1]; return ans }

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/145160799

相关文章:

LeetCode 3066.超过阈值的最少操作数 II:模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间

【LetMeFly】3066.超过阈值的最少操作数 II&#xff1a;模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-operations-to-exceed-threshold-value-ii/ 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一次…...

深度学习中的模块复用原则(定义一次还是多次)

文章目录 1. 模块复用的核心原则&#xff08;1&#xff09;模块是否有**可学习参数**&#xff08;2&#xff09;模块是否有**内部状态**&#xff08;3&#xff09;模块的功能需求是否一致 2. 必须单独定义的模块&#xff08;1&#xff09;nn.Linear&#xff08;全连接层&#x…...

Mac——Cpolar内网穿透实战

摘要 本文介绍了在Mac系统上实现内网穿透的方法&#xff0c;通过打开远程登录、局域网内测试SSH远程连接&#xff0c;以及利用cpolar工具实现公网SSH远程连接MacOS的步骤。包括安装配置homebrew、安装cpolar服务、获取SSH隧道公网地址及测试公网连接等关键环节。 1. MacOS打开…...

安全测评主要标准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 安全测评的主要标准‌包括多个国际和国内的标准&#xff0c;这些标准为信息系统和产品的安全评估提供了基础和指导。 一、安全测评的主要标准 1.1、国际标准 ‌可信计算机系统评估准则&#xff08;TC…...

qBittorent访问webui时提示unauthorized解决方法

现象描述 QNAP使用Container Station运行容器&#xff0c;使用Docker封装qBittorrent时&#xff0c;访问IP:PORT的方式后无法访问到webui&#xff0c;而是提示unauthorized&#xff0c;如图&#xff1a; 原因分析 此时通常是由于设备IP与qBittorrent的ip地址不在同一个网段导致…...

504 Gateway Timeout:网关超时解决方法

一、什么是 504Gateway Timeout&#xff1f; 1. 错误定义 504 Gateway Timeout 是 HTTP 状态码的一种&#xff0c;表示网关或代理服务器在等待上游服务器响应时超时。通俗来说&#xff0c;这是服务器之间“对话失败”导致的。 2. 常见触发场景 Nginx 超时&#xff1a;反向代…...

Vue 实现当前页面刷新的几种方法

以下是 Vue 中实现当前页面刷新的几种方法&#xff1a; 方法一&#xff1a;使用 $router.go(0) 方法 通过Vue Router进行重新导航&#xff0c;可以实现页面的局部刷新&#xff0c;而不丢失全局状态。具体实现方式有两种&#xff1a; 实现代码&#xff1a; <template&g…...

MCP Server开发的入门教程(python和pip)

使用python技术栈开发的简单mcp server 需要安装 MCP server的需要使用python-sdk,python需要 3.10,安装如下 pip install mcpPS: MCP官方使用的是uv包管理工具,我平时使用pip比较多,所以文中以pip为主。因为mcp的一些依赖包版本并不是最新的,所以最好弄一个干净的环境…...

手撕Transformer -- Day7 -- Decoder

手撕Transformer – Day7 – Decoder Transformer 网络结构图 目录 手撕Transformer -- Day7 -- DecoderTransformer 网络结构图Decoder 代码Part1 库函数Part2 实现一个解码器Decoder&#xff0c;作为一个类Part3 测试 参考 Transformer 网络结构 Decoder 代码 Part1 库函数…...

C#异步和多线程,Thread,Task和async/await关键字--12

目录 一.多线程和异步的区别 1.多线程 2.异步编程 多线程和异步的区别 二.Thread,Task和async/await关键字的区别 1.Thread 2.Task 3.async/await 三.Thread,Task和async/await关键字的详细对比 1.Thread和Task的详细对比 2.Task 与 async/await 的配合使用 3. asy…...

使用分割 Mask 和 K-means 聚类获取天空的颜色

引言 在计算机视觉领域&#xff0c;获取天空的颜色是一个常见任务&#xff0c;广泛应用于天气分析、环境感知和图像增强等场景。本篇博客将介绍如何通过已知的天空区域 Mask 提取天空像素&#xff0c;并使用 K-means 聚类分析天空颜色&#xff0c;最终根据颜色占比查表得到主导…...

145.《redis原生超详细使用》

文章目录 什么是redisredis 安装启动redis数据类型redis key操作key 的增key 的查key 的改key 的删key 是否存在key 查看所有key 「设置」过期时间key 「查看」过期时间key 「移除」过期时间key 「查看」数据类型key 「匹配」符合条件的keykey 「移动」到其他数据库 redis数据类…...

Pytorch基础教程:从零实现手写数字分类

文章目录 1.Pytorch简介2.理解tensor2.1 一维矩阵2.2 二维矩阵2.3 三维矩阵 3.创建tensor3.1 你可以直接从一个Python列表或NumPy数组创建一个tensor&#xff1a;3.2 创建特定形状的tensor3.3 创建三维tensor3.4 使用随机数填充tensor3.5 指定tensor的数据类型 4.tensor基本运算…...

【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统

文章目录 参考资料云盘资料软硬件环境手机解锁刷机驱动绑定账号和设备解锁手机 Mindows工具箱安装工具箱和修复下载下载安卓和woa资源包第三方Recovery 一键安装Windows准备工作创建分区安装系统 效果展示Windows和Android一键互换Win切换安卓安卓切换Win 删除分区 参考资料 解…...

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人&#xff0c;做完后需要合并 遇到情况如下 那是因为直接选择了整列&#xff0c;当然不可以了。 下面提供几种方法&#xff0c;应该都可以 直接选中要复制区域然后复制&#xff0c;不要选中最上面的列alt;选中可见单元格正常复制&#xff…...

HBASE学习(一)

1.HBASE基础架构&#xff0c; 1.1 参考&#xff1a; HBase集群架构与读写优化&#xff1a;理解核心机制与性能提升-CSDN博客 1.2问题&#xff1a; 1.FLUSH对hbase的影响 2. HLog和memstore的区别 hlog中存储的是操作记录&#xff0c;比如写、删除。而memstor中存储的是写入…...

element select 绑定一个对象{}

背景&#xff1a; select组件的使用&#xff0c;适用广泛的基础单选 v-model 的值为当前被选中的 el-option 的 value 属性值。但是我们这里想绑定一个对象&#xff0c;一个el-option对应的对象。 <el-select v-model"state.form.modelA" …...

Sprint Boot教程之五十八:动态启动/停止 Kafka 监听器

Spring Boot – 动态启动/停止 Kafka 监听器 当 Spring Boot 应用程序启动时&#xff0c;Kafka Listener 的默认行为是开始监听某个主题。但是&#xff0c;有些情况下我们不想在应用程序启动后立即启动它。 要动态启动或停止 Kafka Listener&#xff0c;我们需要三种主要方法…...

C:JSON-C简介

介绍 JSON-C是一个用于处理JSON格式数据的C语言库&#xff0c;提供了一系列操作JSON数据的函数。 一、json参数类型 typedef enum json_type { json_type_null, json_type_boolean, json_type_double, json_type_int, json_type_object, json_type_ar…...

业务幂等性技术架构体系之消息幂等深入剖析

在系统中当使用消息队列时&#xff0c;无论做哪种技术选型&#xff0c;有很多问题是无论如何也不能忽视的&#xff0c;如&#xff1a;消息必达、消息幂等等。本文以典型的RabbitMQ为例&#xff0c;讲解如何保证消息幂等的可实施解决方案&#xff0c;其他MQ选型均可参考。 一、…...

Windows 10 64位系统下Neo4j社区版与桌面版安装全攻略(2023最新版)

1. Neo4j简介与安装准备 如果你正在寻找一款强大的图数据库来管理复杂的关系数据&#xff0c;Neo4j绝对是个不错的选择。作为目前最流行的开源图数据库&#xff0c;它用起来就像在画一张巨大的网络图——每个节点代表实体&#xff08;比如人或产品&#xff09;&#xff0c;每条…...

AI大模型时代:微店商品数据API如何重构反向海淘决策

在AI大模型时代&#xff0c;微店商品数据API凭借覆盖下沉市场、小众货源、私域供给的独特优势&#xff0c;成为重构反向海淘决策的核心支撑&#xff0c;将传统“人工经验判断”升级为“数据采集→AI分析→自动决策→反馈优化”的全链路数据驱动模式&#xff0c;大幅提升选品精准…...

Qwen3.5-9B-AWQ-4bit部署教程:Docker容器内路径映射与模型加载权限配置

Qwen3.5-9B-AWQ-4bit部署教程&#xff1a;Docker容器内路径映射与模型加载权限配置 1. 引言 今天我们要探讨的是如何在Docker环境中部署Qwen3.5-9B-AWQ-4bit模型&#xff0c;这是一个支持图像理解的多模态模型。这个模型能够结合上传的图片与文字提示词&#xff0c;输出中文分…...

【架构实战】健康检查与故障转移机制

一、为什么需要健康检查 在分布式系统中&#xff0c;服务实例可能因为各种原因变得不可用&#xff0c;而调用方却毫不知情&#xff0c;继续向故障实例发送请求&#xff0c;导致大量失败。常见的服务不可用场景&#xff1a;- 进程假死&#xff1a;Java进程存在但无法响应请求&am…...

价值投资中的智能城市废水处理与再利用系统分析

价值投资中的智能城市废水处理与再利用系统分析 关键词:价值投资、智能城市、废水处理、废水再利用、系统分析 摘要:本文聚焦于价值投资视角下的智能城市废水处理与再利用系统。首先介绍了研究的背景,包括目的、预期读者、文档结构和相关术语。接着阐述了智能城市废水处理与…...

Linux配置静态ip地址和Oracle VM VirtualBox导入/导出虚拟机Centos7

导入虚拟机选择管理 - 导入虚拟电脑找到自己的虚拟机位置修改内存大小&#xff0c;默认虚拟机电脑位置&#xff0c;MAC地址等导入后点击设置如下图&#xff1a;修改网络-网 -- 卡1&#xff0c;其他基本不需要修改桥接网络选好网卡接入网线&#xff1b;设置好网络以后使用命令重…...

石油勘探中的地震波“翻译官”:如何读懂时距曲线图里的地下秘密?

石油勘探中的地震波“翻译官”&#xff1a;如何读懂时距曲线图里的地下秘密&#xff1f; 站在戈壁滩的勘探营地&#xff0c;望着屏幕上那些看似杂乱的波形曲线&#xff0c;刚入行的地质工程师小李皱起了眉头。"这些弯弯曲曲的线条&#xff0c;到底在诉说什么样的地下故事&…...

深入S32K3XX以太网内部:用逻辑分析仪抓取MII时序,图解数据收发全过程

深入S32K3XX以太网内部&#xff1a;用逻辑分析仪抓取MII时序&#xff0c;图解数据收发全过程 在嵌入式系统开发中&#xff0c;以太网通信的底层实现往往像一个黑盒子——我们配置好寄存器&#xff0c;数据就神奇地传输了。但对于真正追求技术深度的开发者来说&#xff0c;理解信…...

VSCode + WSL-Ubuntu 20.04 开发环境配置:从零搭建C++开发环境(含Clangd智能补全)

VSCode WSL-Ubuntu 20.04 开发环境配置&#xff1a;从零搭建C开发环境&#xff08;含Clangd智能补全&#xff09; 在跨平台开发日益普及的今天&#xff0c;微软推出的WSL&#xff08;Windows Subsystem for Linux&#xff09;为Windows开发者提供了无缝的Linux开发体验。结合…...

半导体器件入门:金半接触的5个关键概念解析(附手稿能带图)

半导体器件入门&#xff1a;金半接触的5个关键概念解析&#xff08;附手稿能带图&#xff09; 第一次翻开半导体物理教材时&#xff0c;金半接触那一章总是让人既兴奋又困惑。那些弯曲的能带图、费米能级的移动、神秘的势垒高度&#xff0c;就像一道通往微电子世界的大门。本文…...