leetcode之二分查找

【C语言】二分查找 在有序表中,每次都取中间元素作为比较的对象。 如果给中间值与给定值相等,则查找成功,返回该元素的下标/索引; 如果中间值大于给定值,则在中间值的右半区间继续查找; 如果中间值小于给定值,则在中间值的左半区间继续查找;........................ 阅读详情

二分查找是一种在每次比较之后将查找空间一分为二的算法。每次需要查找集合中的索引或元素时,都应该考虑二分查找。如果集合是无序的,我们可以总是在应用二分查找之前先对其进行排序。

成功的二分查找的 3 个部分

二分查找一般由三个主要部分组成:

  1. 预处理 —— 如果集合未排序,则进行排序。
  2. 二分查找 —— 使用循环或递归在每次比较后将查找空间划分为两半。
  3. 后处理 —— 在剩余空间中确定可行的候选者。

模板

int	binarySearch(int[]	nums,	int	target)	{
				int	left	=	0,	right	=	...;  //right的初始化于搜索区间的类型决定,为了不越界
				while(...)  //终止条件,决定这搜索区间是左闭右开还是左闭右闭
                {
						int	mid	=left+(right-left)/2;  //可以防止溢出
						if	(nums[mid]	==	target)	{
								...               //数据更新
						}	else if	(nums[mid]<	target)	{
								left	=	...   //left更新,依据是下一步去哪个区间进行搜索
						}	else if	(nums[mid]>	target)	{
								right	=	...   //right更新,依据是下一步去哪个区间进行搜索
						}
				}
				return	...;
}
初始条件:left = 0, right = length-1
终止:left > right
向左查找:right = mid-1
向右查找:left = mid+1

关键

分析二分查找的一个技巧是:不要出现 else,而是把所有情况用else if写清楚,这样可以清楚地展现所有细节。本文都会使用else if,旨在讲清楚,读者理解后可自行简化。其中…标记的部分,就是可能出现细节问题的地方,当你⻅到一个二分查找的代码时,首先注意这几个地方。后文用实例分析这些地方能有什么样的变化。
另外声明一下,计算 mid 时需要防止溢出,代码中 left+(right-left)/2 就和(left+right)/2 的结果相同,但是有效防止了left和right太大直接相加导致溢出。

一定要明白,我维持查找的窗口是怎么样的,我查找完以后里面的细节是怎么样的(也就是怎么缩小窗口)

例题:

我们正在玩一个猜数字游戏。 游戏规则如下:
我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。
每次你猜错了,我会告诉你这个数字是大了还是小了。
你调用一个预先定义好的接口 guess(int num),它会返回 3 个可能的结果(-1,1 或 0):

-1 : 我的数字比较小
 1 : 我的数字比较大
 0 : 恭喜!你猜对了!

示例 :

输入: n = 10, pick = 6
输出: 6
class Solution {
public:
    int guessNumber(int n) {
        int L=1,R=n;
        while(L<=R)//维持一个[left,right],这也决定了right的初始化
        {
            int mid=L+(R-L)/2;//L+R会溢出,超出int
            cout<<mid;
            int tar=guess(mid);
            if(tar==0) return mid;
            else if(tar==1) L=mid+1;//加加减减是根据下一步去那个区间寻找决定的;
            else if(tar==-1) R=mid-1;
        }
        
        return -1;
        
    }
};

示例:

寻找右边界

给你一个大小为 m * n 的方阵 mat,方阵由若干军人和平民组成,分别用 1 和 0 表示。

请你返回方阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。

如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。

军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。
输入:mat = 
[[1,1,0,0,0],
 [1,1,1,1,0],
 [1,0,0,0,0],
 [1,1,0,0,0],
 [1,1,1,1,1]], 
k = 3
输出:[2,0,3]
解释:
每行中的军人数目:
行 0 -> 2 
行 1 -> 4 
行 2 -> 1 
行 3 -> 2 
行 4 -> 5 
从最弱到最强对这些行排序后得到 [2,0,3,1,4]

class Solution {
public:
    vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
        //思路,查找右边界,找出每一行,军人的位置.
        //然后把位置压入一个vector,再利用sort()
        vector<int> res(3,0);
        int row=mat.size();
        int col=mat[0].size();
        map<int,int> tmpres;
        for(int i=0;i<row;i++)
        {
    
            int left=0,right=col-1;
            while(left<=right)//这里维持的查找区间是[left,right]
            {
                int mid=left+(right-left)/2;
                if(mat[i][mid]==1)//找到后数据更新
                {
                    left=mid+1;
                }
                else if(mat[i][mid]!=1)//未找到数据更新
                {
                    right=mid-1;
                }
               
            }
                //返回
                tmpres[right+1]=i; 
        }
        for(auto &t:tmpres)
        {
            cout<<t.first<<endl;
        }
          
        return res;

    }
};
用Seurat和ComplexHeatmap绘制单细胞marker基因热图:从数据处理到可视化全流程 本文详细介绍了使用Seurat和ComplexHeatmap绘制单细胞marker基因热图的全流程,涵盖从数据处理、基因筛选、平均表达矩阵计算到高级可视化与注释添加。重点解析了如何利用ComplexHeatmap生成发表级热图,并整合热词信息,解决单细胞数据可视化中的常见问题,提升科研图表质量。 阅读详情

相关推荐

告别信号毛刺!手把手教你用ADS和IBIS-AMI模型搞定PCIe Gen3眼图仿真

本文详细介绍了如何使用Keysight ADS和IBIS-AMI模型进行PCIe Gen3眼图仿真,解决高速信号传输中的信号质量问题。从仿真环境搭建、S参数预处理到眼图优化与故障排除,提供了一套完整的工程实践指南,帮助工程师提升PCIe Gen3接口的信号完整性。

weixin_28366053的博客 370

二分查找--图文详解

二分查找也称折半查找,是在一组有序(升序/降序)的数据中查找一个元素,它是一种效率较高的查找方法。

iLoyo_的博客 3万+

泛微OAe9-自定义资源看板

OA中,有一个很好用的功能:会议室预约。对于一间设立的会议室,同一时间段内,肯定会有不同的人预约同一间会议室,并且,在资源看板里,能看清各个时间段会议室的占用情况,可是会议室资源是有限的,显然不可能让多个人在同一时间段内预约同一间会议室,如会议室已占用,其他人再次申请时,应当拒绝预约。

小松鼠的博客 1848

二分查找(折半查找)

二分查找是一种算法,其输入是一个有序的元素列表(必须是有序的),如果查找的元素包含在列表中,二分查找返回其位置,否则返回NULL 比如说有一个1-100的数字,我随机的选择其中一个数字(假设为60),你需要以最少的次数猜到我所选择的数字,每次猜测后,我会告诉你大了,小了,对了。 假设你第一次从1开始猜,小了 第二次:2 小了 第三次:3 小了 …… 第五十九次:59小了 ...

zmeilin的博客 15万+

从补码原理到实践:RISC-V中addi指令的符号扩展机制详解

本文深入解析了RISC-V架构中addi指令的符号扩展机制。从补码的数学原理出发,详细阐述了12位立即数在指令编码中如何通过符号位进行扩展,并结合lui指令,揭示了加载任意32位立即数的正确方法与实践陷阱,帮助开发者编写高效可靠的底层代码。

weixin_29161719的博客 139

【阿里云大模型高级工程师ACP习题集】2.7 通过微调增强模型能力 (下篇)(⭐️⭐️⭐️ 重点章节!!!)

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 1118

【二分查找】有这一篇足够了

【二分查找】(折半查找)有这一篇足够了 1.二分查找是干啥的 2. 力扣中的一些练习题 2.1 二分查找 2.2 第一个错误的版本 2.3 搜索插入位置 2.4 在排序数组中查找元素第一个和最后一个位置 2.5x的平方根 2.6 有效的完全平方数 3.总结一下

m0_58761900的博客 1万+

PE启动盘结合360杀毒离线版:深度清除顽固病毒实战指南

在系统安全维护领域,离线查杀是一种在独立于宿主操作系统的环境下进行病毒扫描和清除的核心技术。其原理是通过一个预启动环境(如PE)加载杀毒软件,从而绕过可能已被感染或受保护的系统核心,直接访问和扫描磁盘文件。这项技术的核心价值在于能够彻底处理那些在正常系统运行时难以清除的深度隐藏病毒、Rootkit和驱动级木马。典型的应用场景包括应对勒索软件、顽固感染型病毒以及系统启动项被劫持等情况。本文以“PE启动盘”和“360杀毒离线版”这一经典组合为例,详细解析了从工具选型、环境部署到深度查杀策略的全流程,为系统维护人

weixin_29741447的博客 410

【算法笔记】二分查找 && 二分答案 (超详细解析,一篇让你搞懂二分)

二分查找应该算是是很多人入门的第一个算法吧,无论是ACM还是蓝桥杯都是必学的算法,很多人都觉得其非常简单,但它真的那么简单吗?Knuth 大佬(发明 KMP 算法的那位)曾说过:(思路很简单,细节是魔鬼)本文将为大家详细讲解二分查找的原理和使用场景并且,我们就是要深入细节,我将从while循环中该不该带mid该不该+1等地方分析这些细节的差异及出现差异的原因,保证你能灵活准确的写出二分查找算法。二分查找,也称为折半查找(Binary Search),是一种在有序数组中查找特定元素的搜索算法。

2302_79577794的博客 2万+

VLA、世界模型与端到端在智驾中的本质关系与工程落地

世界模型并非3D重建,而是对环境状态转移函数的可微分建模;VLA不是视觉+语言+动作的简单拼接,核心在于跨模态语义对齐。二者共同支撑具身智能系统实现从感知到行动的闭环推演,其技术价值体现在长尾场景泛化能力提升与决策延迟降低。在自动驾驶领域,真实量产方案均采用VLA架构作为多模态感知基础,嵌入轻量级世界模型以支持反事实轨迹推演,并通过WA硬件封装保障实时性,最终由端到端控制层完成像素到扭矩的语义贯通。这种混合架构已成L2+/L3智驾系统的工程共识。

weixin_34163553的博客 365

41、矩形和圆柱形开槽微带贴片天线设计及性能分析

本文提出了一种适用于ISM频段(2.4 - 2.48 GHz)的微带圆形贴片天线,专为生物医学植入和可穿戴设备设计。通过在贴片上蚀刻矩形槽并去除圆柱形槽,实现了小型化与性能优化。采用Rogers 3010基板材料,结合缺陷接地结构(DGS)技术,有效改善了带宽、回波损耗和极化纯度。仿真结果显示,天线在弯曲状态下仍保持良好性能,回波损耗达-13 dB,VSWR为1.6,方向性提升至5.38 dB。与以往设计相比,本次设计在回波损耗和谐振频率稳定性方面表现优异,具备良好的生物相容性和应用潜力。未来将从开槽结构、

github5actions的博客 259

力扣LeetCode704:二分查找

力扣704:二分查找三种解法

diemeng9339的博客 686

SAP 合并报表(EC-CS)完整方法论 + 全业务操作步骤

SAP合并报表(EC-CS)方法论与操作指南摘要 SAP EC-CS模块提供完整的集团合并解决方案,其核心方法论基于会计准则和集团管控逻辑,通过6大维度构建标准化合并体系:组织架构标准化、数据采集标准化、外币换算规则化、内部交易自动化抵消、股权与商誉规范化、报表出具灵活化。 实施过程分为两个阶段: 上线前配置阶段(12个步骤):包括合并架构搭建、科目表配置、外币规则设定、抵消规则定义等基础工作 日常操作阶段(10个步骤):涵盖数据报送、外币换算、内部对账、自动抵消、调整分录等月结流程 系统优势包括: 支持多

金牌架构师 1365

leetcode力扣_二分查找(已完结)

② 第二种是二分查找法,二分查找的下界设置为 0 ,上界设置为 x ,定义一个中间变量 mid ,然后将 mid 做如下定义,这样定义的目的是防止越界,如果直接定义为 (right + left) / 2 在计算过程中,(right + left) 的结果可能会超出 int 所能表达的最大数字。① 第一种就是暴力解法,因为 x 开方之后的值肯定是小于等于其本身的,所以定义一个变量 i 让它从 0~i 遍历并比较i*i 和 x 的大小,注意返回的值是 i 还是 i+1。如果不存在这样的字符,则返回。

bici_1的博客 974

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

力扣(leetcode)hot 100二分查找看这一篇就够了

这章主要介绍一下力扣hot 100里面二分查找问题的做法。保证看了的人都能学会怎么做

yyyCode的博客 1114

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[Golang]力扣Leetcode - 704. 二分查找(二分查找)

[Golang]力扣Leetcode - 704. 二分查找(二分查找)

皮埃尔的博客 309

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

二分查找-704.二分查找-力扣(LeetCode)

这里加一操作对数据个数为奇数时没有影响,当数据为偶数时,二分点有两个,上面没加一的mid是靠近left的那个二分点,而加一的mid则是靠近right的按个二分点。由于是循环进行的,所以我们还需要确定循环的条件。回到我们的二分查找,我们需要以下几个变量,left(左区间),right(右区间),mid(二分点),会遇到三种情况,大于target,小于target,或等于target。这里可以不局限于找中间点,三分点,四分点等等都是可以的,不过,根据概率学的数学期望,二分点无疑是最好的。解法二:二分查找算法。

black_bear_white的博客 636

【力扣Leetcode】二分查找专题(Python刷题)704,35,69,367,441,33,34,153,162,4

leetcode刷题,持续更新。python实现二分法,题目:704,35,69,367,441,33,34,153,162,4……

m0_52023710的博客 2093

力扣刷题【二分查找】

二分查找(Binary Search)

qq_55630411的博客 298

力扣每日一练之二分查找Day7

力扣每日一练之二分查找Day7 🍕前面的话🥞 大家好!本篇文章将介绍20天算法刷题计划的题,本文将以三道题作为背景,介绍经典的二分查找,展示语言为java(博主学习语言为java)。今天呢,是博主开始刷力扣的第七天,如果有想要开始准备自己的算法面试的同学,可以跟着我的脚步一起,共同进步。大家都是并肩作战的伙伴,一起努力奋力前行,路漫漫其修远兮,吾将上下而求索,相信我们一定都可以拿到自己期望的offer,冲冲冲! 👩‍💻博客主页:京与旧铺的博客主页 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,cs

qq_46272491的博客 1193

力扣预备-二分查找

文章目录1.什么是二分查找?2.例题2.1 力扣2.2 力扣352.3 力扣162 1.什么是二分查找? 以升序数列为例,比较一个元素与数列中的中间位置的元素的大小,如果比中间位置的元素大,则继续在后半部分的数列中进行二分查找;如果比中间位置的元素小,则在数列的前半部分进行比较;如果相等,则找到了元素的位置。每次比较的数列长度都会是之前数列的一半,直到找到相等元素的位置或者最终没有找到要找的元素。 2.例题 2.1 力扣 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target

Bazinga23333的博客 259

力扣二分查找

力扣二分查找704 二分查找1.要求2.思路69 x 的平方根1.要求744 寻找比目标字母大的最小字母1.要求2.思路540有序数组中的单一元素1.要求2.思路153. 寻找旋转排序数组中的最小值1.要求2.思路 704 二分查找 1.要求 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标...

dayday学习的博客 736

力扣——每日一题——二分查找

题目来源于力扣——704. 二分查找 - 力扣(LeetCode) (leetcode-cn.com) 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 示例2: 输入: nums = [-1,0,3,5,9,12], t.

爱编程的晖哥的博客 559

力扣leetcode算法-二分查找

在升序数组 nums 中寻找目标值 target,对于特定下标 i,比较 nums[i] 和 target 的大小:基于上述事实,可以在有序数组中使用二分查找寻找目标值。二分查找的做法是,定义查找的范围[left,right],初始查找范围是整个数组。每次取查找范围的中点mid,比较nums[mid] 和target 的大小,如果相等则mid 即为要寻找的下标,如果不相等则根据 nums[mid] 和target 的大小关系将查找范围缩小一半。由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是

少说,多做 9124

【力扣刷题】二分查找

n],你想找出导致之后所有版本出错的第一个错误的版本。给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回 -1。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。注意:不必纠结数组的长度为奇数还是偶数,不会影响怎么排除的问题。来源:力扣(LeetCode)

ws135867的博客 303

力扣100二刷——二分查找、栈、堆

第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。

weixin_49426115的博客 993
上一篇: 图解快排
下一篇: 相机标定原理
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值