每日算法刷题计划Day20 6.2:leetcode二分答案3道题,用时1h20min
9.3048.标记所有下标的最早秒数(中等)
3048. 标记所有下标的最早秒数 I - 力扣(LeetCode)
思想
1.给你两个下标从 1 开始的整数数组 nums
和 changeIndices
,数组的长度分别为 n
和 m
。
一开始,nums
中所有下标都是未标记的,你的任务是标记 nums
中 所有 下标。
从第 1
秒到第 m
秒(包括 第 m
秒),对于每一秒 s
,你可以执行以下操作 之一 :
- 选择范围
[1, n]
中的一个下标i
,并且将nums[i]
减少1
。 - 如果
nums[changeIndices[s]]
等于0
,标记 下标changeIndices[s]
。 - 什么也不做。
请你返回范围[1, m]
中的一个整数,表示最优操作下,标记nums
中 所有 下标的 最早秒数 ,如果无法标记所有下标,返回-1
。
2.单调性检验:秒数越少,越不可能标记nums
中所有下标,所以存在一个最少秒数
3.本题难点在于check函数怎么写,我的思路是changeIndices
中下标i
最后一次出现的位置(核心) 取消标记,只要之前的次数大于nums[i-1]
(因为i在[1,m]
)就能成功标记,所以需要记录下标-最后出现位置的数据结构,用map和vector<pair<int,int>>都可以,但要注意map只能按键排序,vector按first和second都行,但是最好直接记录最后出现的位置-下标
4.学习别人思路:
(1)也是记录i在chanegIndices
最后一次出现的位置,但是直接用vector<int>
存储即可,因为i属于[0,n)
,且无需像我那样一点要从最后找到第一次出现位置last[i]
,直接顺序迭代更新即可,用后面的值覆盖前面的值
(2)然后利用一个cnt变量记录可以消耗的值 - 是
last[i]
,即判断cnt和nums[i]
的大小 - 不是
last[i]
,++cnt
代码
c++:
class Solution {
public:bool check(vector<int>& nums, vector<int>& changeIndices, int mid) {vector<pair<int, int>> v; // 最后位置-下标int n = nums.size(), m = changeIndices.size();for (int i = 1; i <= n; ++i) {int j = mid - 1;while (j >= 0 && changeIndices[j] != i)--j;if (j < 0)return false;v.emplace_back(j, i);}sort(v.begin(), v.end());int cnt = 0; // 用了几个for (const auto x : v) {int last = x.first, id = x.second;if (last - cnt < nums[id - 1])return false;cnt += nums[id - 1] + 1;}return true;}int earliestSecondToMarkIndices(vector<int>& nums,vector<int>& changeIndices) {int res = -1;int n = nums.size(), m = changeIndices.size();set<int> s;for (const int x : changeIndices)s.insert(x);if (s.size() < n)return -1;int left = 1, right = m;while (left <= right) {int mid = left + ((right - left) >> 1);if (check(nums, changeIndices, mid)) {res = mid;right = mid - 1;} elseleft = mid + 1;}return res;}
};
学习check函数:
bool check(vector<int>& nums, vector<int>& changeIndices, int mid) {int n = nums.size(), m = changeIndices.size();vector<int> lasti(n, -1); // 最后位置for (int i = 0; i < mid; ++i)lasti[changeIndices[i] - 1] = i;for (int i = 0; i < n; ++i) {if (lasti[i] == -1)return false;}int cnt = 0; // 可用几个for (int i = 0; i < mid; ++i) {int id = changeIndices[i] - 1;if (lasti[id] == i) {if (cnt < nums[id])return false;cnt -= nums[id];} else++cnt;}return true;
}
2.2 求最大
在练习时,请注意「求最小」和「求最大」的二分写法上的区别。
前面的「求最小」和二分查找求「排序数组中某元素的第一个位置」是类似的,按照红蓝染色法,左边是不满足要求的(红色),右边则是满足要求的(蓝色)。
「求最大」的题目则相反,左边是满足要求的(蓝色),右边是不满足要求的(红色)。这会导致二分写法和上面的「求最小」有一些区别。
以开区间二分为例:
求最小:check(mid) == true 时更新 right = mid,反之更新 left = mid,最后返回 right。
求最大:check(mid) == true 时更新 left = mid,反之更新 right = mid,最后返回 left。
对于开区间写法,简单来说 check(mid) == true 时更新的是谁,最后就返回谁。相比其他二分写法,开区间写法不需要思考加一减一等细节,推荐使用开区间写二分。
1.套路
c++:
class Solution {
public:bool check(vector<int>& citations, int mid) {}int hIndex(vector<int>& citations) {int res = 0;int n = citations.size();int left = 0, right = min(n, citations[n - 1]);while (left <= right) {int mid = left + ((right - left) >> 1);if (check(citations, mid)) {res = mid;left = mid + 1; // 还可能有更大的值满足条件} elseright = mid - 1;}return res;}
};
2.题目描述
1.给你一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数,citations
已经按照 非降序排列。计算并返回该研究者的 h 指数(答案)。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h
指数是指他(她)的 (n
篇论文中)至少 有 h
篇论文分别被引用了至少 h
次(条件)。
2.给你一个 下标从 0 开始 的整数数组 candies
。数组中的每个元素表示大小为 candies[i]
的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 ,但 无法 再将两堆合并到一起。
另给你一个整数 k
。你需要将这些糖果分配给 k
个小孩,使每个小孩分到 相同 数量的糖果(条件)。每个小孩可以拿走 至多一堆 糖果,有些糖果可能会不被分配。
返回每个小孩可以拿走的 最大糖果数目(答案) 。
3.学习经验
(1)求最大合法区间在右边,所以满足条件是left=mid+1
,而求最小是right=mid-1
1. 275.H指数II
275. H 指数 II - 力扣(LeetCode)
思想
1.给你一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数,citations
已经按照 非降序排列 。计算并返回该研究者的 h 指数。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h
指数是指他(她)的 (n
篇论文中)至少 有 h
篇论文分别被引用了至少 h
次。
2.单调性检验:若h越大,越不可能满足条件,但若h满足条件,小于h的值肯定满足条件,即至少有 h
篇论文分别被引用了至少h
次,那肯定有小于h
篇论文分别被引用了至少h
次,满足单调性
3.我的思想:是找到第一个大于mid的引用次数,然后判断文章数,但这样要花费时间找第一个大于mid的引用次数的下标
4.学习:可以直接假设文章数为mid,然后判断n-mid
处的引用次数是否大于mid,O(1)的复杂度
代码
c++:
class Solution {
public:bool check(vector<int>& citations, int mid) {int n = citations.size();int i = 0;while (i < n && citations[i] < mid)++i;if (i == n)return false;if (n - i >= mid)return true;elsereturn false;}int hIndex(vector<int>& citations) {int res = 0;int n = citations.size();int left = 0, right = min(n, citations[n - 1]);while (left <= right) {int mid = left + ((right - left) >> 1);if (check(citations, mid)) {res = mid;left = mid + 1; // 还可能有更大的值满足条件} elseright = mid - 1;}return res;}
};
学习:
bool check(vector<int>& citations, int mid) {int n = citations.size();if (mid == 0 || citations[n - mid] >= mid) // mid有可能为0return true;elsereturn false;
}
2. 2226.每个小孩最多能分到多少糖果
2226. 每个小孩最多能分到多少糖果 - 力扣(LeetCode)
思想
1.给你一个 下标从 0 开始 的整数数组 candies
。数组中的每个元素表示大小为 candies[i]
的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 ,但 无法 再将两堆合并到一起。
另给你一个整数 k
。你需要将这些糖果分配给 k
个小孩,使每个小孩分到 相同 数量的糖果。每个小孩可以拿走 至多一堆 糖果,有些糖果可能会不被分配。
返回每个小孩可以拿走的 最大糖果数目 。
2.单调性检验:糖果数目越大,越不能均分,所以存在一个最大糖果数目,且小于该糖果数目的值也一定满足条件,满足单调性
3.一个堆只能分一次子堆,就是商
代码
c++:
class Solution {
public:bool check(vector<int>& candies, long long k, long long mid) {if (mid == 0) // 注意下面除数不能为0return true;long long cnt = 0;for (const int x : candies) {cnt += (long long)x / mid;if (cnt >= k)return true;}return false;}int maximumCandies(vector<int>& candies, long long k) {int res = 0;long long sum = 0;for (const int x : candies)sum += x;if (sum < k)return 0;long long left = 0, right = sum / k;while (left <= right) {long long mid = left + ((right - left) >> 1);if (check(candies, k, mid)) {res = mid;left = mid + 1;} elseright = mid - 1;}return res;}
};
相关文章:
每日算法刷题计划Day20 6.2:leetcode二分答案3道题,用时1h20min
9.3048.标记所有下标的最早秒数(中等) 3048. 标记所有下标的最早秒数 I - 力扣(LeetCode) 思想 1.给你两个下标从 1 开始的整数数组 nums 和 changeIndices ,数组的长度分别为 n 和 m 。 一开始,nums 中所有下标都是未标记的&a…...
Spring Security安全实践指南
安全性的核心价值 用户视角的数据敏感性认知 从终端用户角度出发,每个应用程序都涉及不同级别的数据敏感度。以电子邮件服务与网上银行为例:前者内容泄露可能仅造成隐私困扰,而后者账户若被操控将直接导致财产损失。这种差异体现了安全防护需要分级实施的基本原则: // 伪…...

Unity + HybirdCLR热更新 入门篇
官方文档 HybridCLR | HybridCLRhttps://hybridclr.doc.code-philosophy.com/docs/intro 什么是HybirdCLR? HybridCLR(原名 huatuo)是一个专为 Unity 项目设计的C#热更新解决方案,它通过扩展 IL2CPP 运行时,使其支持动态加载和…...
QuickBASIC QB64 支持 64 位系统和跨平台Linux/MAC OS
QuickBASIC 的现代继任者 QB64 已发展成为一个功能强大的开源项目,支持 64 位系统和跨平台开发。以下是详细介绍: 项目首页 - QB64pe:The QB64 Phoenix Edition Repository - GitCode https://gitcode.com/gh_mirrors/qb/QB64pe 1. QB64 概述 官网&am…...

ElasticSearch迁移至openGauss
Elasticsearch 作为一种高效的全文搜索引擎,广泛应用于实时搜索、日志分析等场景。而 openGauss,作为一款企业级关系型数据库,强调事务处理与数据一致性。那么,当这两者的应用场景和技术架构发生交集时,如何实现它们之…...

【C语言极简自学笔记】项目开发——扫雷游戏
一、项目概述 1.项目背景 扫雷是一款经典的益智游戏,由于它简单而富有挑战性的玩法深受人们喜爱。在 C 语言学习过程中,开发扫雷游戏是一个非常合适的实践项目,它能够综合运用 C 语言的多种基础知识,如数组、函数、循环、条件判…...
Global Security Markets 第5章知识点总结
一、章节核心内容概述 《Global Securities Markets》第五章聚焦全球主要证券交易所、关联存管机构及跨境交易实务,重点解析“乘客市场(Passenger Markets)”概念与合规风险,同时涵盖交易费用、监管规则等实操要点。考虑到市场的…...
电子电路:4017计数器工作原理解析
4017是CMOS十进制计数器/分频器,它属于CD4000系列,工作电压范围比较宽,可能3V到15V。我记得它有10个译码输出端,每个输出端依次在高电平和低电平之间循环,可能用于时序控制或者LED显示什么的。 4017内部应该由计数器和译码器两部分组成。计数器部分可能是一个约翰逊计数器…...
Vim 中设置插入模式下输入中文
在 Vim 中设置插入模式下输入中文需要配置输入法切换和 Vim 的相关设置。以下是详细步骤: 1. 确保系统已安装中文输入法 在 Linux 系统中,常用的中文输入法有: IBus(推荐):支持拼音、五笔等Fcitx…...
GitHub 趋势日报 (2025年05月31日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 1153 prompt-eng-interactive-tutorial 509 BillionMail 435 ai-agents-for-begin…...

Maven概述,搭建,使用
一.Maven概述 Maven是Apache软件基金会的一个开源项目,是一个有优秀的项目构建(创建)工具,它用来帮助开发者管理项目中的jar,以及jar之间的依赖关系,完成项目的编译,测试,打包和发布等工作. 我在当前学习阶段遇到过的jar文件: MySQL官方提供的JDBC驱动文件,通常命名为mysql-…...
基于大模型的数据库MCP Server设计与实现
基于大模型的数据库MCP Server设计与实现 引言 随着大语言模型(LLM, Large Language Model)能力的不断提升,AI Agent(智能体)正在从简单的对话问答,向更复杂的自动化任务执行和业务流程管理演进。在企业和开发者的实际需求中,数据库操作是最常见、最核心的场景之一。如…...
【前端】macOS 的 Gatekeeper 安全机制阻止你加载 bcrypt_lib.node 文件 如何解决
这个弹窗是 macOS 的 Gatekeeper 安全机制阻止你加载 bcrypt_lib.node 文件,因为它不是 Apple 签名的文件。 你想 “忽视” 它,其实是让系统允许这个 .node 原生模块运行,解决方式如下: sudo xattr -d com.apple.quarantine nod…...

Unity 环境搭建
Unity是一款游戏引擎,可用于开发各种类型的游戏和交互式应用程序。它由Unity Technologies开发,并在多个平台上运行,包括Windows、macOS、Linux、iOS、Android和WebGL。Unity也支持虚拟现实(VR)和增强现实(AR)技术,允许用户构建逼…...
【入门】【练9.3】 加四密码
| 时间限制:C/C 1000MS,其他语言 2000MS 内存限制:C/C 64MB,其他语言 128MB 难度:中等 分数:100 OI排行榜得分:12(0.1*分数2*难度) 出题人:root | 描述 要将 China…...

使用 SASS 与 CSS Grid 实现鼠标悬停动态布局变换效果
最终效果概述 页面为 3x3 的彩色格子网格;当鼠标悬停任意格子,所在的行和列被放大;使用纯 CSS 实现,无需 JavaScript;利用 SASS 的模块能力大幅减少冗余代码。 HTML 结构 我们使用非常基础的结构,9 个 .i…...
Node.js 全栈开发方向常见面试题
Node.js 全栈开发”方向的面试题**,这类岗位通常包括: 后端:Node.js(Express/Nest)、数据库、REST API、安全、部署等 前端:React/Vue(部分可能含 Next.js)、API 调用、状态管理等 …...

Spring如何实现组件扫描与@Component注解原理
Spring如何实现组件扫描与Component注解原理 注解配置与包扫描的实现机制一、概述:什么是注解配置与包扫描?二、处理流程概览三、注解定义ComponentScope 四、核心代码结构1. ClassPathScanningCandidateComponentProvider2. ClassPathBeanDefinitionSca…...
历年四川大学计算机保研上机真题
2025四川大学计算机保研上机真题 2024四川大学计算机保研上机真题 2023四川大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 分数求和 题目描述 有一分数序列: 2 / 1 2/1 2/1, 3 / 2 3/2 3/2, 5 / 3 5/3 5/3, 8 / 5 8/5 8/5, 13 /…...
gcc符号表生成机制
符号表生成机制 我们以C语言的编译链接过程为例,详细讲解符号表(Symbol Table)的流程,涵盖编译和链接两个阶段。理解符号表是理解链接器如何解决符号引用(如函数、变量)的关键。 符号表分为两种ÿ…...

达梦数据库 Windows 系统安装教程
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
unix/linux source 命令,其基本概念、定义、性质、定理
从计算机科学的角度,特别是形式语言、操作系统和编程语言设计的角度来看,source (或 .) 命令虽然看似简单,但其背后也蕴含着一些核心的概念、定义、性质和可以类比的“定理”(或者说,更准确地是“设计原则”或“行为模式”)。 让我们尝试从一个更理论和结构化的视角来剖…...

【Java EE初阶】计算机是如何⼯作的
计算机是如何⼯作的 计算机发展史冯诺依曼体系(Von Neumann Architecture)CPU指令(Instruction)CPU 是如何执行指令的(重点) 操作系统(Operating System)进程(process) 进程 PCB 中的…...

RAG理论基础总结
目录 概念 流程 文档收集和切割 读取文档 转换文档 写入文档 向量转换和存储 搜索请求构建 向量存储工作原理 向量数据库 文档过滤和检索 检索前 检索 检索后 查询增强和关联 QuestionAnswerAdvisor查询增强 高级RAG架构 自纠错 RAG(C-RAG…...

列表推导式(Python)
[表达式 for 变量 in 列表] 注意:in后面不仅可以放列表,还可以放range ()可迭代对象 [表达式 for 变量 in 列表 if 条件]...
嵌入式RTC工作原理及应用场景
20ppm 是衡量 RTC(实时时钟)精度的关键指标,表示 每百万秒(约11.57天)的最大时间误差范围。以下是通俗易懂的解释: 1. ppm 的含义 ppm Parts Per Million(百万分之一) 1 ppm 1/1,…...

一天搞懂深度学习--李宏毅教程笔记
目录 1. Introduction of Deep Learning1.1. Neural Network - A Set of Function1.2. Learning Target - Define the goodness of a function1.3. Learn! - Pick the best functionLocal minimaBackpropagation 2. Tips for Training Deep Neural Network3. Variant of Neural…...
Go语言常见接口设计技巧-《Go语言实战指南》
在 Go 中,接口是连接代码组件的桥梁。合理设计接口可以大幅提升程序的可维护性、可扩展性和测试友好性。本章将分享 Go 开发中常见的接口设计技巧与最佳实践。 一、接口设计原则 1. 面向接口编程,而非面向实现编程 尽量使用接口类型作为函数参数或返回值…...

python打卡训练营打卡记录day43
复习日 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 数据集来源:Flowers Recognition 选择该数据集原因: 中等规模:4242张图片 - 训练快速但足够展示效…...
Camera相机人脸识别系列专题分析之十一:人脸特征检测FFD算法之低功耗libvega_face.so人脸属性(年龄,性别,肤色,微笑,种族等)检测流程详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:Camera相机人脸识别系列专题分析之十:人脸特征检测FFD算法之低功耗libvega_face.so人脸识别检测流程详解 这一篇我们开始讲: Camera相机人脸识别系列专题分析之十一:人脸特征检测FFD算法之低功耗lib…...