二分查找算法的题解集合

【饿了么笔试题汇总】2024-04-12-饿了么春招笔试题-三语言题解(CPP/Python/Java) K小姐要举办一个生日派对,她邀请了 nnn 个好朋友。每个朋友都准备了一份礼物,其中第 iii 个朋友的礼物价值为 aia_iai​。K小姐想知道,这些礼物中一共有多少种不同价值的礼物。但是她不希望统计那些太便宜的礼物,所以她不会统计价值为 111 的礼物。第一行包含一个正整数 nnn,表示朋友的人数。第二行包含 nnn 个正整数 a1,a2,⋯ ,ana_1, a_2, \cdots, a_na1​,a2​,⋯,an​,表示每个朋友礼物的价值。输出一个整数,表示有多少种不同价值的礼物(不包括价值为 111 阅读详情

leetcode704.基本的二分查找

题目:https://leetcode.cn/problems/binary-search/

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

解法:

//基本的二分查找(考虑:边界问题)
public static int search_basic(int[] nums, int target){
    int left = 0 , right = nums.length;  // 注意点1
    int mid = -1;
    while(left < right){  // 注意点2
        // 与 (left + right) / 2 得到的结果一致。
        // 下面这种写法可以一定程度避免 left + right 导致 int类型超过最大值。
        mid = left + (right - left) / 2;
        if(nums[mid] == target){
            return mid;
        }else if (nums[mid] < target){
            left = mid + 1;
        }else if(nums[mid] > target){
            right = mid;   // 注意点3
        }
    }
    return -1;
}
  • 注意点1:这里的 right = nums.length,如果修改为 right = nums.length - 1,代码如何修改?

解释:这里的使用的是 [left,right),也就是左闭右开的区间。如果使用左闭右闭的区间(right = nums.length - 1),代码修改如下:

//基本的二分查找(考虑:边界问题)
public static int search_basic(int[] nums, int target){
    int left = 0 , right = nums.length - 1;  // 注意点1
    int mid = -1;
    // 注意点2:如果此时依旧使用 “<” 作为条件,
    // 当搜索区间为 [2,2],[3,3],.. 时,区间里还有一个数没有判断,但条件已经不满足了。
    while(left <= right){  
       ....
       else if(nums[mid] > target){
            right = mid - 1;   // 注意点3
       }
    }
    return -1;
}

leetcode34.在排序数组中查找元素的第一个和最后一个位置

题目:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例3:

输入:nums = [], target = 0
输出:[-1,-1]

这道题可以分为两部分:1.找到值为 target 的第一个下标(左边界)。2.找到值为 target 的最后一个下标(右边界)

public static int[] search_left_right_bound(int[] nums, int target){
    int[] idx = {-1,-1};
    int left = 0 , right = nums.length - 1;
    int mid = -1;
    // 找到左边界
    while(left <= right){
        // 与 (left + right) / 2 得到的结果一致。
        // 下面这种写法可以一定程度避免 left + right 导致 int类型超过最大值。
        mid = left + (right - left) / 2;
        if(nums[mid] == target){
            
            right = mid - 1;
        }else if (nums[mid] < target){
            left = mid + 1;
        }else if(nums[mid] > target){
            right = mid - 1;
        }
    }
    if(left < 0 || left >= nums.length) return idx;

    if(nums[left] == target){
        idx[0] = left;
    }

    left = 0;
    right = nums.length - 1;
    // 找到右边界
    while(left <= right){
        // 与 (left + right) / 2 得到的结果一致。
        // 下面这种写法可以一定程度避免 left + right 导致 int类型超过最大值。
        mid = left + (right - left) / 2;
        if(nums[mid] == target){
            left = mid + 1;
        }else if (nums[mid] < target){
            left = mid + 1;
        }else if(nums[mid] > target){
            right = mid - 1;
        }
    }

    if(right < 0 ){
        return idx;
    }

    if(nums[right] == target){
        idx[1] = right;
    }

    return idx;
}

后续

【有时间会整理更多的二分查找相关的题解…】

参考

  1. 《labuladong的算法小抄》
  2. https://www.cnblogs.com/sunshuyi/p/12681088.html
4D毫米波雷达 详解4D成像毫米波雷达 阅读详情

相关推荐

告别 RPA 和 Selenium,MCP + Playwright 成为自动化开发新宠!

摘要: 随着数字化转型加速,传统自动化工具(如RPA和Selenium)在复杂场景中暴露出开发成本高、灵活性不足等问题。新一代解决方案MCP(Model Context Protocol)与Playwright的结合,通过AI与自动化的无缝对接,实现了智能化的任务处理。MCP支持自然语言交互和上下文感知,开发者无需编写复杂代码即可生成自动化脚本;Playwright则提供多浏览器支持、高性能和易用性。二者结合显著提升开发效率,使自动化更智能、灵活。文章还对比了VS Code与Trae中配置Playwrigh

我先测了 2208

代码随想录 - 数组 - 1 - 二分查找

代码随想录 - 数组 - 1 - 二分查找

qq_50755868的博客 987

集群路径规划实战(一)之EGO-swarm环境搭建与调试

本文详细介绍了EGO-swarm分布式无人机集群运动规划系统的仿真环境搭建与调试全流程。内容涵盖ROS Melodic安装、代码获取、依赖库配置、编译问题解决(如multi_map_server头文件缺失)以及最终通过roslaunch启动集群仿真与Rviz可视化,为学习和研究集群路径规划算法提供了可运行的实战平台。

weixin_29243279的博客 250

没有金三银四,就业形势依然严峻,大厂开始卷996和大小周了

31号下午面的1. 重绘和重排是什么,如何避免2. 虚拟DOM的优点3. 实现一个两列布局,左定宽,cvte,快手,得物,蓝月亮,蓝禾,奇安信,三七互娱,顺丰,康冠科技,金证科技24春招内推①得物【岗。以前的一段面经,当时二面完就挂了,分享一下,过程中提出了很多具有深度的问题,可惜当时真的太菜了3.1。各位佬能给个建议吗,目前大三下,我现在感觉考研太难了,就是在赌过的可能性,但是我现在专业技能还很菜,从开始找实习到现在也有一年的时间了,也幸运地找到了两份大厂实习,突然想写点东西记录从开始到现在的心境。

华鑫的专栏 1198

从登录到应用可见:在 SAP S/4HANA Cloud Private Edition 中创建用户与打通 SAP Fiori 权限的完整思路

在SAP S/4HANA系统中,用户创建远非简单的账号开通,而是涉及认证、授权、数据访问等多维度的复杂过程。用户主数据记录(User Master Record)是系统访问的起点,包含登录方式、角色分配等关键信息。认证解决"你是谁"的问题,授权则决定"你能做什么"。SAP Fiori访问链路涉及Launchpad内容分配、应用启动映射、OData服务权限等多层校验。角色(Role)通过PFCG维护,包含业务目录(Catalog)和空间(Space)等元素,共同构成完整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 148

无人船 | 基于ROS的轻量级多无人艇自主导航仿真框架

无人水面艇USV是海上自主无人系统的关键组成部分,在民用、军用领域应用广泛,例如海上救援、水质测量、扫雷反潜等,因此对USV导航算法的研究具有重要意义。为了便于进行USV相关算法的验证与部署,本文介绍的这套基于ROS的多无人艇的自主导航仿真平台,轻量化地实现了建图、规划、控制等多种功能,同时自研框架保证了功能的高度可拓展和可定制

FRIGIDWINTER的博客 8002

12C题解

L1-113~ L1-120与L2-57~L2-60赶稿,后面再改。

j2ry_s6nc1rl0的博客 419

MATLAB和S7-1200PLC水箱液位高度PID控制联合仿真(KEPserverOPC通信应用)

SMART PLC 向导PID的详细介绍请查看下面文章链接:S7-200 SMART PLC PID向导详细介绍(如何实现P、PD、PID控制器)-优快云博客文章浏览阅读1k次。这篇博客主要介绍SMART PLC PID向导的使用,PID控制相关的其它内容请查看专栏系列文章,常用链接如下:SMART PLC PID负压控制(过程量为负数)_负压控制pid控制程序_RXXW_Dor的博客-优快云博客1、如何实现PID反作用调节?S7-1200PLC和KEPserver OPC通信-优快云博客。

RXXW_Dor的博客 1781

题目:367.有效的完全平方数

leetcode 题目:367.有效的完全平方数

2301_76145947的博客 144

Rockchip eMMC寿命监控:SMART信息读取与预防性维护

擦写计数坏块数量温度使用时间。

小灰灰的博客 762

【深度学习】Progressive Distillation for Fast Sampling of Diffusion Models

这种方法通过迭代地将一个需要较多步骤的模型(称为教师模型)蒸馏成一个需要较少步骤的学生模型,每次迭代都将采样步骤减半,直到达到所需的采样步骤数量。通过渐进式蒸馏,论文将原始需要8192步采样的模型成功蒸馏为只需4步采样就能取得接近的生成质量的新模型,大幅提高了扩散模型的推理效率。这篇论文提出了一种"渐进式蒸馏"(Progressive Distillation)的方法,来大幅降低用于生成对抗网络(GAN)的扩散模型(Diffusion Model)在推理阶段的采样步数,从而提高其推理效率。

q742971636的博客 1786

【题解】—— LeetCode一周小结15

LeetCode每日一道一周小结15

ZShiJ的博客 1154

【问题解决】解决 Python `PermissionError` 权限不足:文件/进程/端口全场景修复

本文总结了Python程序中常见的权限问题及解决方案,包括文件、进程和端口权限错误。文件权限问题通常由文件占用、权限不足或路径错误引起;进程问题多因权限不足或系统限制;端口问题则与端口占用、防火墙或特权端口相关。解决方案提供了详细的代码实现:文件权限管理器类(FilePermissionManager)包含检查权限(check_permission)、修复权限(fix_permission)、安全写入(safe_write)和安全删除(safe_delete)等方法,通过异常处理和临时文件等技术确保操作安全

博客 357

JavaScript版LeetCode题解,你值得拥有

LeetCode题解Js版 https://webbj97.github.io/leetCode-Js/ 题外话 博健的LeetCode题解:传送门 前端笔记:传送门 项目背景 旨在提高自己对算法的理解,将题解总结成文章,有利于未来自查,也希望能对大家有所...

余光的博客 3500

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

51nod-1557 两个集合

1557 两个集合 思路:暴力搜索判断,两年前写的自己都看不懂了。。。 Code: #include<iostream> #include<algorithm> using namespace std; const int MAX_N=100005; int n,a,b; int c[MAX_N]; int d[MAX_N]...

随风而行的博客 369

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LeetCode 363. 矩形区域不超过 K 的最大数值和

难度:困难。 标签:队列,二分查找,动态规划。 动态规划(暴力版) 使用动态规划做,dp[i][j]dp[i][j]dp[i][j]表示以matrix[i][j]matrix[i][j]matrix[i][j]开始的矩阵的和,代码中step_i和step_j表示当前矩阵的大小。 predp[i][j]predp[i][j]predp[i][j]表示上一个step_j=1时的dp。在dp[i][j]dp[i][j]dp[i][j]中i或j递增时,加相应的predp[][]predp[][]predp[][]的

almost_afei的博客 155

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LeetCode 1847.最近的房间:有序集合

LeetCode 1847.最近的房间:有序集合 一个酒店里有 n 个房间,这些房间用二维整数数组 rooms 表示,其中 rooms[i] = [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。 同时给你 k 个查询,用二维数组 queries 表示,其中 queries[j] = [preferredj, minSizej] 。第 j 个查询的答案是满足如下条件的房间 id : 房间的面积 至少

<font color="Pink">Tisfy的博客</font> 836

CSP-M2 补题

A - HRZ 的序列(#t1) B - HRZ 学英语(#t2) C - 咕咕东的奇妙序列(#t3) A - HRZ 的序列 题目 思路 将所有数字放入集合中记录出现的数字种类。若数字种类小于等于3,则满足要求,若大于3,则不满足要求。 代码 #include <iostream> #include <cstdio> #include <algorithm> #include <set> #define llint long long #define m

JusticeDevilman的博客 279

二分查找算法

我们如果在循环里面判断,就会需要求middle,这个时候middle就不变化,而nums[middle]是符合nums[middle]>=target的,所以会执行right=middle;左边不一定有峰值,右边一定有峰值,这个时候我们应该让mid往右边去靠近,那只能移动left,这个时候nums[mid]绝对不是是右边的峰值,而nums[mid+1]有可能是右边(不包括i)的峰值,所以我们让left=mid+1即可。当我们的数据量很大的时候,这个right+left的时候,是会溢出的。

2301_80224556的博客 1039

【题解-信息学奥赛一本通】1245:不重复地输出数

输入n个数,从小到大将它们输出,重复的数只输出一次。保证不同的数不超过500个。一行,从小到大不重复地输出这些数,相邻两个数之间用单个空格隔开。第一行是一个整数n。之后n行,每行一个整数。整数大小在int范围内。

写代码的犄角旮瘩 148

二分解法(集合A,B,C是否存在各取一个元素使之等于输入的S值)

#include&amp;amp;lt;cstdio&amp;amp;gt; #include&amp;amp;lt;iostream&amp;amp;gt; #include&amp;amp;lt;algorithm&amp;amp;gt; using namespace std; int a[500],b[500],c[500],d[250010]; int main() { int l,n,m; int s; i

名字呢? 272

【Hello 2018 D】Too Easy Problems

【链接】 我是链接,点我呀:) 【题意】 在这里输入题意 【题解】 可以考虑把所有的题目按照ai排序。 然后顺序考虑最后做出来的题目个数和第i道题目的ai一样。 则1..i-1这些题目就没有用了。 值考虑i..n这些题目就可以了。 显然考虑ti最小的若干项。 使得它们的时间和<=T然后不超过a[i] 可以二分选择了前mid小的题目。 看看时间和以及题目个数是否满足要...

AWCXV 70
上一篇: 使用U盘在物理机中安装 Centos7【解决dracut-initqueue[]:Warning:dracut-inituenue timeout问题】
下一篇: 【JUC(一)】进程、线程与管程
种花途。
博客等级 码龄10年 3粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值