二分查找算法及其实例

2023-11-04

二分查找算法及其实例

问题一:二分查找

  1. 给定一个 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], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1
提示:
你可以假设 nums 中的所有元素是不重复的。 n 将在 [1, 10000]之间。 nums 的每个元素都将在 [-9999,9999]之间。

解题思路

  • 二分查找算法是通过不断缩小需要查找的目标区域,直到找到目标值,或者区域为空,结束循环
  • 具体来讲,先要找到左右边界然后(Right + Left) / 2即为当前查找区域的中点,通过判断中点值与目标target的大小关系,选择缩小哪一边的边界,每次至少能够排除当前区域的一半,这里需要注意左右边界在更新时不是直接等于 mid 而是等于 mid±1,否则会造成当区域大小为2时死循环
  • 以下是C++代码实现
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int Left = 0;
        int Right = nums.size()-1;
        while (Left <= Right)
        {
            int mid = (Right + Left) / 2;
            if (nums[mid] > target)
            {
                Right = mid - 1;
            }
            else if (nums[mid] < target)
            {
                Left = mid + 1;
            }
            else
            {
                return mid;
            }
        }
        return -1;
    }
};

问题二:第一个错误的版本

  1. 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
  • 假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
  • 你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

示例 1:
输入:n = 5, bad = 4
输出:4
解释:调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true 所以,4 是第一个错误的版本。

示例 2:
输入:n = 1, bad = 1
输出:1

提示:
1 <= bad <= n <= 2^31 - 1

解题思路

  • 在二分查找的基础上需要调整目标值的判断方式,在此问题中所求目标值是没有唯一的参照物的,所以不能单纯i通过isBadVersion接口返回的bool值判断是否是首个错误的版本,而是需要多判断一次mid+1时的情况,通过两次判断锁定首个错误的版本
  • 具体来说就是当isBadVersion(mid)返回为false时表明mid的左边全是好的版本,那么范围就缩小到mid的右边了,如果此时isBadVersion(mid+1)返回为true这表示就在mid+1的位置出现了第一个错误的版本
// The API isBadVersion is defined for you.
bool isBadVersion(int version);

class Solution {
public:
    int firstBadVersion(int n) {
        long left = 1;
        long right = n;
        while(left<=right)
        {
            long mid = (left+right)/2;
            if(isBadVersion(mid) == true)
            {
               right = mid-1;
            }
            else if(isBadVersion(mid) == false)
            {
               //当二分区域的mid值不是错误版本时,证明首个错误版本就在(mid,right]之间,因此判断mid+1是否时首个错误版本
                if(isBadVersion(mid+1) == true)
                {
                    return mid + 1;
                }
                else
                {
                    left = mid + 1;
                }
            }
        }
        return 1;
    }
};

问题三:搜索插入位置

  1. 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。

示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
-104<= target <= 104
nums 为 无重复元素 的 升序 排列数组

解题思路

  • 此题思路与第一题类似但是多出了一种情况,就是当值不在数组中时需要返回需要插入的位置,因此我们在每次判断mid大于或者小于目标值后,还需要注意其相邻值是否小于或大于目标值,这里的相邻指的是在当前查找范围内的一侧的相邻值,如果一方大于另一方小于则表明此数在数组中不存在,插入位置就是当前的mid或者mid+1的位置
  • 若查找范围缩小为空仍然没找到对应位置,那么根据现在left或right的所在位置判断,如果left超过数组最右侧,则表示需要插入的元素在最右边,否则在最左边插入
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        while(left<=right)
        {
            int mid = (left+right)/2;
            if(nums[mid] == target)
            {
                return mid;
            }
            else if(nums[mid] > target)
            {
                if(mid-1>=0 && nums[mid-1] < target)
                {
                    return mid;
                }
                right = mid - 1;
            }
            else
            {
                if(mid+1<=nums.size()-1 && nums[mid + 1] > target)
                {
                    return mid + 1;
                }
                left = mid + 1;
            }
        }
        if(left>nums.size()-1)
        {
            return nums.size();
        }
        else
        {
            return 0;
        }
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二分查找算法及其实例 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • mkfs.jffs2工具安装

    安装mkfs jffs2工具 unrar free x rar tar jxvf mtd snapshot 20050519 tar bz2 mtd snapshot 20050519 tar bz2 cd mtd configure 如果
  • KNN算法——基本原理、分类、回归

    算法原理 KNN算法的核心思维 相似度较高的样本 映射到n维空间后 其距离回避相似度较低的样本在距离上更加接近 KNN 即K近邻算法 K近邻就是K个最近的邻居 当需要预测一个未知样本的时候 就由与该样本最接近的K个邻居来决定 KNN既可以用
  • 算法设计与分析期末复习题(史上最详细)

    算法设计与分析期末复习题 一 1 二分搜索算法是利用 A 实现的算法 A 分治策略 B 动态规划法 C 贪心法 D 回溯法 2 下列不是动态规划算法基本步骤的是 A A 找出最优解的性质 B 构造最优解 C 算出最优解 D 定义最优解 3
  • 数据一致性部分算法基础

    分布式部分算法 思考 Zookeeper 是如何保证数据一致性的 这也是困扰分布式系统框架的一个难题 Paxos算法 Paxos算法 一种基于消息传递且具有高度容错特性的一致性算法 Paxos算法解决的问题 就是如何快速正确的在一个分布式系
  • 配置JSTL 解决错误:org.apache.jasper.JasperException

    最近配置JSTL 遇到如下错误 org apache jasper JasperException This absolute uri http java sun com jsf core cannot be resolved in eit
  • SpringBoot进阶-日志等级配置与操作

    SpringBoot进阶 日志等级配置与操作 一 日志等级 二 设置日志等级 三 打印日志 四 自定义日志格式 五 文件记录日志 一 日志等级 trace 最低等级 debug 调试用 通常用于跟踪程序进展 info 记录用 通常用于记录程
  • excel表格vlookup函数怎么用_excel查找函数应用:vlookup多种情景的运用技巧

    编按 哈喽 大家好 VLOOKUP可算得上是查询函数界的大明星 但如何用它同时在两张工作表 甚至多张 如三张 四张工作表中查询需要的数据呢 下面这篇文章就给大家揭晓答案 学习更多技巧 请收藏关注部落窝教育excel图文教程 俗话说一个好汉三
  • SQL server 增删查改

    使用 sqlserver 数据库的基础便是增删改查 下面记录这些常见的数据库指令 首先我的前置条件 是创建了一个数据库 test 并创建了一个 Student 表 表中字段为 Id stuName stuSex stuAge 代码如 下 c
  • 关于PLC的scl语言

    本人小白一个 只是刚刚学习scl 想与大家分享一下 如果您是大佬 请勿喷 在我的理解 PLC就像单片机 而scl语言就像C语言 例如scl语言里的 就是C里的 如果学过C将会事半功倍 SCL语言学习并不需要什么网上视频 譬如我在某宝上买了一
  • python读取apifox测试报告中接口信息

    背景 使用apifox进行了接口测试 但是没有办法对两次的接口测试响应时间进行对比 因为apifox的测试报告是html格式的文件 所以可以读取html 提取出接口信息 接口报告如下 解决思路 语言 python 1 读取html文件内容
  • powershell_基础语法

    文章目录 范围 比较运算符 布尔运算 switch 示例 范围 1 20 for x 1 x lt 10 x x 1 echo x foreach i in 1 20 echo i 比较运算符 eq 等于 ne 不等于 gt 大于 ge 大
  • vue+element ui 中国标准化时间转换日期多种格式

    vue element ui 中国标准化时间转换日期多种格式 最近在做项目的时候用到了DatePicker 日期选择器 结果选好日期获取日期value得到这个玩意儿 有点恶心的中国标准化时间 如果想要转化成2021 04 3或 2021 0
  • 解决 Spring Cloud 部分版本,使用 nacos 做配置中心,报 No spring.config.import property has been defined 的问题

    报错信息如下 Description No spring config import property has been defined Spring 官方给出的解决方案如下 Add a spring config import nacos
  • Spring Cloud服务框架版本升级--JDK10+Gradle4.9+Spring Boot 2.0+Finchley.SR1

    目标 原有版本升级为Spring Boot 2 0与Spring Cloud Finchley SR1 使用gradle管理工程 搭建注册 配置 网关与追踪框架 加入k8s api微服务 环境 IntelliJ IDEA 步骤 版本升级及其
  • 大数据毕业设计 电商用户行为数据分析可视化 - python

    文章目录 0 前言 一 背景描述 二 项目背景 三 数据来源 四 提出问题 五 理解数据 六 数据清洗 6 1缺失值处理 6 2查看数据 6 3一致化处理 6 4查看data user数据集数据类型 6 5数据类型转换 6 6异常值处理 七
  • 对接微信支付接口开发详细步骤

    1 第一步 我们需要从哪里入手 当然我们需要有微信商家账号怎样申请商家账号呢 当然还是需要有一个已经审核过的微信公众号 这样的话 首先你必须先有个审核通过的微信公众号 这里就不说怎么审核公众号了这个公众号比较好弄 如何申请微信商户号 如图
  • ORA-01578的处理

    某天一台数据库测试机出现 ORA 01578 虽说这是测试机但是这是客户用的 随便处理也不行 仔细研究一下 ORA 01578 ORACLE data block corrupted file 2 block 69449 ORA 01110
  • LeetCode(Python)—— 只出现一次的数字(简单)

    只出现一次的数字 概述 给定一个非空整数数组 除了某个元素只出现一次以外 其余每个元素均出现两次 找出那个只出现了一次的元素 你的算法应该具有线性时间复杂度 你可以不使用额外空间来实现吗 输入 2 2 1 输出 1 输入 4 1 2 1 2
  • [机缘参悟-77]:深度思考-《天道》中强势文化、弱势文化与人的行为模式的关系

    目录 一 文化属性与人的行为模式 二 强势文化与弱势文化 2 1 弱势文化的本质与其行为模式 2 2 强势文化的本质与其行为模式 三 强势文化造就强者 弱势文化造就弱者 一 文化属性与人的行为模式 文化 是一个广义词 它的概括面相当的广泛
  • 二分查找算法及其实例

    二分查找算法及其实例 问题一 二分查找 给定一个 n 个元素有序的 升序 整型数组 nums 和一个目标值 target 写一个函数搜索 nums 中的 target 如果目标值存在返回下标 否则返回 1 示例 1 输入 nums 1 0