每日算法-250411
这是我今天的 LeetCode 刷题记录和心得,主要涉及了二分查找的应用。
3143. 正方形中的最多点数
题目简述:

思路
本题的核心思路是 二分查找。
解题过程
为什么可以二分?
我们可以对正方形的半边长 len 进行二分。当正方形的半边长 len 越大时,可能包含的点越多,但也越有可能包含具有相同标签的点。反之,len 越小,包含的点越少,标签冲突的可能性也越小。包含点数的多少以及是否合法(无重复标签)相对于 len 的增长,具有一定的单调性(或者说,存在一个最大的 len 使得正方形合法),这满足二分查找的条件。
二分什么?
我们需要二分查找满足条件的 最大 正方形半边长 len。查找范围可以从 0 到所有点坐标绝对值的最大值。
如何检查(check 函数)?
check(len) 函数用于判断以半边长 len 构成的正方形是否“合法”。
合法性判断包含两步:
- 遍历所有点,检查其坐标
(x, y)是否满足abs(x) <= len且abs(y) <= len。 - 对于落在正方形内的点,使用一个哈希表(或大小为 26 的数组
hash)记录出现的标签。如果在添加一个点的标签时,发现该标签已经存在于哈希表中(即hash[s[i] - 'a'] >= 1),则说明存在重复标签,该len值对应的正方形不合法,check返回false。 - 如果遍历完所有点都没有发现重复标签,则该
len合法,check返回true。
指针如何移动?
在二分查找过程中:
- 计算中间值
mid。 - 调用
check(mid):- 如果
check(mid)返回true,说明半边长为mid的正方形是合法的。这表示我们可能可以找到一个更大的合法正方形,因此我们尝试增大边长,将搜索范围的左边界更新为left = mid + 1。同时,因为这是一个合法的len,我们需要记录下此时正方形内的点数(可以在check函数内部完成,或者在check返回true时更新全局变量ret)。 - 如果
check(mid)返回false,说明半边长为mid的正方形不合法(有标签冲突),意味着当前的len太大了,我们需要缩短边长,将搜索范围的右边界更新为right = mid - 1。
- 如果
最终结果:
二分查找结束后,变量 ret 中存储的就是满足条件的最大合法正方形所包含的点数。
复杂度
- 时间复杂度: O ( N log M ) O(N \log M) O(NlogM),其中 N N N 是点的数量, M M M 是坐标的最大绝对值(二分查找的上界)。
check函数需要 O ( N ) O(N) O(N) 时间,二分查找进行 log M \log M logM 次。 - 空间复杂度: O ( C ) O(C) O(C) 或 O ( N ) O(N) O(N)。 O ( C ) O(C) O(C) 是指存储标签计数的哈希表/数组所需空间( C = 26 C=26 C=26)。如果考虑最坏情况下所有点标签不同且都在某个正方形内,可能认为是 O ( N ) O(N) O(N),但通常关注辅助空间,所以 O ( C ) O(C) O(C) 更精确描述
check函数的额外空间。
Code
class Solution {private int ret;public int maxPointsInsideSquare(int[][] points, String ss) {char[] s = ss.toCharArray();int left = 0;int right = 0;for (int[] point : points) {right = Math.max(right, Math.max(Math.abs(point[0]), Math.abs(point[1])));}while (left <= right) {int mid = left + (right - left) / 2;if (check(points, s, mid)) {left = mid + 1;} else {right = mid - 1;}}return ret;}private boolean check(int[][] points, char[] s, int len) {int[] hash = new int[26];int tmp = 0; // 合法正方形里点的个数// 1.是不是合法的for (int i = 0; i < points.length; i++) {if (Math.abs(points[i][0]) <= len && Math.abs(points[i][1]) <= len) {if (hash[s[i] - 'a'] >= 1) {// 标签已经存在return false;}hash[s[i] - 'a']++;tmp++;}}// 2.更新数目ret = tmp;return true;}
}
69. x 的平方根
题目简述:

思路
采用 二分查找。
解题过程
为什么可以二分?
我们要找的是一个整数 ans,使得 ans * ans <= x 并且 (ans + 1) * (ans + 1) > x。考虑函数 f(y) = y * y,这是一个在非负整数域上的单调递增函数。我们需要找到满足 y*y <= x 的最大整数 y。这种在单调序列(或具有单调性质的函数)上查找满足特定条件的边界值的问题,非常适合使用二分查找。
二分什么?
二分查找的目标值,即可能的平方根 mid。查找范围是 [0, x](或者可以优化为 [0, x/2 + 1] 或像代码中的 [1, x/2],需要处理 x=0, 1 的边界情况,原代码 right = x/2 对于 x=0, 1 需要注意,但最终逻辑能处理)。
指针如何移动?
在二分查找 [left, right] 区间内:
- 计算中间值
mid。为了防止mid * mid溢出int,使用long类型进行计算和比较。 - 比较
(long)mid * mid与x:- 如果
mid * mid < x:说明mid太小了,它可能是平方根的一部分,但我们应该尝试更大的值。真正的整数平方根应该在mid的右侧(或就是mid本身)。所以,更新搜索区间的左边界left = mid + 1。 - 如果
mid * mid >= x:说明mid可能等于x的平方根,或者比它大。我们需要尝试更小的值(或者mid就是边界)。所以,更新搜索区间的右边界right = mid - 1。
- 如果
返回什么?
循环终止条件是 left > right。根据二分查找的实现方式,最终 left 指针将指向第一个满足 mid * mid > x 的 mid(或者说,left 是满足 (left-1)*(left-1) <= x 的最小 left)。
分析代码中的返回逻辑 return left * left == x ? left : left - 1;:
- 循环结束后,
left的值是第一个使得mid*mid >= x评估为true时的mid值加 1(或者是mid本身,如果mid*mid == x且之后right被设为mid-1导致循环结束)。 - 如果
left * left == x,说明left正好是x的精确整数平方根,直接返回left。 - 如果
left * left != x(根据循环条件,此时必然是left * left > x),这意味着left已经超过了目标平方根,而left - 1是最后一个满足(left - 1) * (left - 1) <= x的整数。因此,返回left - 1作为x的平方根的整数部分。
复杂度
- 时间复杂度: O ( log x ) O(\log x) O(logx),二分查找的范围是
x(或x/2),每次迭代区间减半。 - 空间复杂度: O ( 1 ) O(1) O(1),只需要常数级别的额外空间。
Code
class Solution {public int mySqrt(int x) {int left = 1, right = x / 2;while (left <= right) {long mid = left + (right - left) / 2;if (mid * mid < x) {left = (int)mid + 1;} else {right = (int)mid - 1;}}return left * left == x ? left : left - 1;}
}
2300. 咒语和药水的成功对数(复习)
题目简述:

这是第二次写这道题,已经可以说是完全掌握了,就不再多说了,详细题解请看 每日算法-250407。
核心思路回顾:
为了高效计算每个 spell 能成功组合的 potion 数量,我们可以:
- 对
potions数组进行 排序。 - 对于每个
spell = spells[i],我们需要找到potions中满足spell * potion >= success的药水数量。由于potions已排序,spell * potion的值也相对于potion是单调递增的(因为spell > 0)。 - 因此,我们可以使用 二分查找 在排序后的
potions数组中找到 第一个 满足potion >= success / spell(注意整数除法和精度问题,最好是比较乘积(long)spell * potions[mid] >= success)的药水的索引idx。 - 所有从
idx到数组末尾m-1的药水都将满足条件。所以,对于spells[i],成功的组合数量是m - idx。
代码 (复习)
class Solution {public int[] successfulPairs(int[] spells, int[] potions, long success) {Arrays.sort(potions);int n = spells.length, m = potions.length;for (int i = 0; i < spells.length; i++) {spells[i] = m - check(potions, spells[i], success);}return spells;}private int check(int[] arr, int spell, long k) {int left = 0, right = arr.length - 1;while (left <= right) {int mid = left + (right - left) / 2;long x = (long)arr[mid] * (long)spell;if (x < k) {left = mid + 1;} else {right = mid - 1;}}return left;}
}
以上就是今天的刷题总结,主要是对二分查找在不同场景下的应用。继续努力!
相关文章:
每日算法-250411
这是我今天的 LeetCode 刷题记录和心得,主要涉及了二分查找的应用。 3143. 正方形中的最多点数 题目简述: 思路 本题的核心思路是 二分查找。 解题过程 为什么可以二分? 我们可以对正方形的半边长 len 进行二分。当正方形的半边长 len 越大时&…...
NO.90十六届蓝桥杯备战|动态规划-区间DP|回文字串|Treats for the Cows|石子合并|248(C++)
区间dp也是线性dp的⼀种,它⽤区间的左右端点来描述状态,通过⼩区间的解来推导出⼤区间的解。因此,区间DP的核⼼思想是将⼤区间划分为⼩区间,它的状态转移⽅程通常依赖于区间的划分点。 常⽤的划分点的⽅式有两个: 基于…...
【大模型LLM第十六篇】Agent学习之浅谈Agent loop的几种常见范式
anthropics agent https://zhuanlan.zhihu.com/p/32454721762 code:https://github.com/anthropics/anthropic-quickstarts/blob/main/computer-use-demo/computer_use_demo/loop.py sampling_loop函数 每次进行循环,输出extract tool_use࿰…...
数列分块入门4
题目描述 给出一个长为 n n n 的数列,以及 n n n 个操作,操作涉及区间加法,区间求和。 输入格式 第一行输入一个数字 n n n。 第二行输入 n n n 个数字,第 i 个数字为 a i a_i ai,以空格隔开。 接下来输入…...
学术分享:基于 ARCADE 数据集评估 Grounding DINO、YOLO 和 DINO 在血管狭窄检测中的效果
一、引言 冠状动脉疾病(CAD)作为全球主要死亡原因之一,其早期准确检测对有效治疗至关重要。X 射线冠状动脉造影(XCA)虽然是诊断 CAD 的金标准,但这些图像的人工解读不仅耗时,还易受观察者间差异…...
程序化广告行业(77/89):融资、并购与上市全景洞察
程序化广告行业(77/89):融资、并购与上市全景洞察 大家好呀!一直以来,我都希望能和大家一起在技术知识的海洋里畅游、学习进步。前面我们已经了解了程序化广告行业的发展态势、PC端和移动端投放差异以及行业融资的大致…...
2025年慕尼黑上海电子展前瞻
年岁之约,齐聚慕展; 乘风而起,畅联未来。 2025 年 4 月 15 - 17 日,备受瞩目的慕尼黑上海电子展即将在上海新国际博览中心盛大启幕。回首2024年展会的场景,那热烈非凡的氛围、精彩纷呈的展示仍历历在目,也…...
第十九:b+树和b-树
优点一: B树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。 优点二: B树所有的Data域在叶子节点,并且所有叶子节点之间都有一个链指针。 这样遍历叶子节点就能获得全部数据,这样…...
前沿科技:社会性交互技术原理与核心概念解析
社会性交互中的**情感识别(Emotion Recognition)与拟人化行为生成(Human-like Behavior Generation)**是构建自然、可信人机交互的核心技术,尤其在虚拟助手、社交机器人、元宇宙角色等场景中至关重要。以下是其技术原理、核心方法与实际应用的系统解析: 一、情感识别:从…...
深入浅出Redis 缓存使用问题 | 长文分享
目录 数据一致性 先更新缓存,后更新数据库【一般不考虑】 先更新数据库,再更新缓存【一般不考虑】 先删除缓存,后更新数据库 先更新数据库,后删除缓存【推荐】 怎么选择这些方案?采用哪种合适? 缓存…...
操作系统 3.6-内存换出
换出算法总览 页面置换算法 FIFO(先进先出): 最简单的页面置换算法,淘汰最早进入内存的页面。 优点:实现简单。 缺点:可能会导致Belady异常,即增加内存反而降低性能。如果刚换入的页面马上又要…...
【Amazon EC2】为何基于浏览器的EC2 Instance Connect 客户端连接不上EC2实例
文章目录 前言📖一、报错先知❌二、问题复现😯三、解决办法🎲四、验证结果👍五、参考链接🔗 前言📖 这篇文章将讲述我在 Amazon EC2 上使用 RHEL9 AMI 时无法连接到 EC2 实例时所遇到的麻烦😖 …...
Java并发编程:深入解析原子操作类与CAS原理
一、原子操作类概述 Java并发包(java.util.concurrent.atomic)提供了一系列原子操作类,这些类通过无锁算法实现了线程安全的操作,相比传统的锁机制具有更高的性能。原子类基于CAS(Compare-And-Swap)指令实现,是现代并发编程的重要基础。 原…...
新一代AI低代码MES,助力企业数字化升级
随着DeepSeek低成本AI模型的火热,对于传统的MES而言,在这场AI的盛宴中,该如何去调整产品的定位,让MES更符合工业企业的需求呢? 工业互联网、AI、数字孪生等技术加速与MES融合,实现生产全流程的实时监控与智…...
位运算与实战场景分析-Java代码版
一、为什么每个程序员都要掌握位运算? 在电商秒杀系统中,位运算可以快速判断库存状态;在权限管理系统里,位运算能用极小的空间存储复杂权限配置;在算法竞赛中,位运算更是高频出现的性能优化利器。这项看似…...
面试之《前端信息加密》
前端代码是直接暴漏给用户的,请求的接口也可以通过控制台network看到参数,这是不够安全的,如果遇到坏人想要破坏,可以直接修改参数,或者频繁访问导致系统崩溃,或数据毁坏。 所以信息加密在某些场合就变得非…...
CentOS 系统磁盘扩容并挂载到根目录(/)的详细步骤
在使用 CentOS 系统时,经常会遇到需要扩展磁盘空间的情况。例如,当虚拟机的磁盘空间不足时,可以通过增加磁盘容量并将其挂载到根目录(/)来解决。以下是一个完整的操作流程,详细介绍了如何将新增的 10G 磁盘…...
HTML应用指南:利用GET请求获取全国汉堡王门店位置信息
在当今快节奏的都市生活中,餐饮品牌的门店布局不仅反映了其市场策略,更折射出消费者对便捷、品质和品牌认同的追求。汉堡王(Burger King)作为全球知名的西式快餐品牌之一,在中国市场同样占据重要地位。自进入中国市场以…...
浅入浅出 GRPO in DeepSeekMath
GRPO in DeepSeekMath GRPO 通过在生成组内进行比较来直接评估模型生成的响应,以优化策略模型,而不是训练单独的价值模型,这种方法显著降低了计算成本。GRPO 可以应用于任何可以确定响应正确性的可验证任务。例如,在数学推理中&a…...
计算机网络起源
互联网的起源和发展是一个充满创新、突破和变革的历程,从20世纪60年代到1989年,这段时期为互联网的诞生和普及奠定了坚实的基础。让我们详细回顾这一段激动人心的历史。 计算机的发展与ARPANET的建立(20世纪60年代) 互联网的诞生…...
HTML 嵌入标签对比:小众(<embed>、<object>) 与 <iframe> 的优缺点及使用场景和方式
需求背景 在网页开发中,嵌入外部资源预览(如视频、PDF、地图或其他网页)是常见的需求。HTML 提供了多种标签来实现这一功能,其中 <embed>、<object> 和 <iframe> 是最常用的三种。本文将对比它们的优缺点&…...
[python] 作用域
Python中查找变量的顺序遵循LEGB规则(Local->Enclosing->Global->Built-in)。Python中的if/elif/else、for/while等代码块不会创建新的作用域,只有def、class、lambda才会改变作用域。这和C中不同,C中在{}代码块中创建的变量离开这个代码块后就…...
AICon 2024年全球人工智能与大模型开发与应用大会(脱敏)PPT汇总(36份).zip
AICon 2024年全球人工智能与大模型开发与应用大会(脱敏)PPT汇总(36份).zip 1、面向开放域的大模型智能体.pdf 2、企业一站式 AI 智能体构建平台演进实践.pdf 3、PPIO 模型平台出海实战,跨地域业务扩展中的技术优化之道…...
51电子表
设计要求: 基本任务: 用单片机和数码管设计可调式电子钟,采用24小时制计时方式,要求能够稳定准确计时,并能调整时间。发光二极管每秒亮灭一次。电子钟显示格式为:时、分、秒各两位,中间有分隔…...
9-函数的定义及用法
一.前言 C 语⾔强调模块化编程,这⾥所说的模块就是函数,即把每⼀个独⽴的功能均抽象为⼀个函数来实现。从⼀定意义上讲,C 语⾔就是由⼀系列函数串组成的。 我们之前把所有代码都写在 main 函数中,这样虽然程序的功能正常实现&…...
高清视频会议系统BeeWorks Meet,支持私有化部署
在数字化办公时代,视频会议已成为企业协作的关键工具。然而,随着信息安全意识的不断提高,传统的公有云视频会议软件已难以满足企业对数据安全和隐私保护的严格要求。BeeWorks Meet凭借其独特的私有化部署模式、强大的功能集成以及对国产化的适…...
用HTML和CSS绘制佩奇:我不是佩奇
在这篇博客中,我将解析一个完全使用HTML和CSS绘制的佩奇(Pig)形象。这个项目展示了CSS的强大能力,仅用样式就能创造出复杂的图形,而不需要任何图片或JavaScript。 项目概述 这个名为"我不是佩奇"的项目是一个纯CSS绘制的卡通猪形象…...
彩讯携Rich AICloud与一体机智算解决方案亮相中国移动云智算大会
2025年4月10日,2025中国移动云智算大会在苏州盛大开幕,本次大会以“由云向智 共绘算网新生态”为主题,与会嘉宾围绕算力展开重点探讨。 大会现场特设区域展出各参会单位的最新算力成果,作为中国移动重要合作伙伴,彩讯…...
BERT - 直接调用transformers.BertModel, BertTokenizerAPI不进行任何微调
本节代码将使用 transformers 库加载预训练的BERT模型和分词器(Tokenizer),并处理文本输入。 1. 加载预训练模型和分词器 from transformers import BertTokenizer, BertModelmodel_path "/Users/azen/Desktop/llm/models/bert-base-…...
安卓开发提示Android Gradle plugin错误
The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模块级 build.gradle(如果有独立配置):…...
