1.力扣刷题之二分查找

news2025/1/16 20:19:17

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

思路

解题

左闭右闭

左闭右开


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

思路

这道题首先要找出关键词:有序数组,元素不重复;这些都是使用二分法的前提条件,当我们看到这些字眼的时候,就要想一下是不是能用二分法。

二分法应该是我们刚学编程时最早遇到的算法题,思想很简单,代码也不困难,但是当中的边界问题,很容易出错。到底是while(left<right)还是while(left<=right),到底是right=middle还是right=middle-1.我在前面有跟大家一起探讨过这类问题,感兴趣的可以看一下我这篇博客

(36条消息) 算法笔记(三)——二分查找(超详细,附带模板)_接受平凡 努力出众的博客-CSDN博客

写二分法,区间的定义主要是两种,左闭右闭即[left,right]或者左闭右开[left,right).

下面就跟大家一起用这两种写法来解题。

解题

左闭右闭

  • while(left<=right):因为在左闭右闭[left,right]的区间内,所以left==right是有意义的,因此使用<=
  • if(nums[middle]>target)right要赋值midd-1,因为当前这个nums[middle]一定不是要找的target并且middle右边的值都比这个目标值要大,所以接下来要缩小范围,那么接下来要查找的左区间结束下标位置就是middle-1

例如在数组,1,2,3,4,7,9,10中查找元素2,如图所示:

 代码示例:

class Solution {
public:
    int search(vector<int>& nums, int target) {
     int left=0;
     int right=nums.size()-1;//定义区间
     while(left<=right)
     {
         int mid=left+(right-left)/2;//防止溢出
         if(nums[mid]==target)
         {
             return mid;//找到target
         }
         else if(nums[mid]<target)
         {
             left=mid+1;//缩小区间,[mid+1,right]
         }
         else{
             right=mid-1;//缩小区间,[left,mid-1]
         }
     }
     return -1;//未找到目标值
    }
};

左闭右开

  • while(left<right):因为区间是[left,right),所以left==right没有意义
  • if(nums[middle]>target)right更新为middle,因为nums[middle]不等于target,并且middle右边的区间都比目标值大,要缩小区间,去左区间继续寻找,因为寻找的区间是左闭右开,所以right更新为middle,即下一个查询区间不会去比较nums[middle]

代码示例: 

class Solution {
public:
    int search(vector<int>& nums, int target) {
     int left=0;
     int right=nums.size();//定义区间
     while(left<right)
     {
         int mid=left+((right-left)>>2);//防止溢出
         if(nums[mid]==target)
         {
             return mid;//找到target
         }
         else if(nums[mid]<target)
         {
             left=mid+1;//缩小区间,[mid+1,right)
         }
         else{
             right=mid;//缩小区间,[left,mid-1)
         }
     }
     return -1;//未找到目标值
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Stable Diffusion和Pokedex的描述生成神奇宝贝图片

还记得我们以前使用GAN、Clip、DALL-E生成神奇宝贝的文章吗&#xff0c;现在是时候使用Stable Diffusion了 在本文中&#xff0c;我将展示如何从神奇宝贝系列不同游戏中的Pokedex条目中获取神奇宝贝描述&#xff0c;并使用Stable Diffusion根据这些藐视生成图片&#xff0c;这样…

【基数排序】 C++高效实现

题目描述 给定你一个长度为 nnn 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 nnn。 第二行包含 nnn 个整数&#xff08;所有整数均在 1∼1091 \sim 10^91∼109 范围内&…

Android架构演进 · 设计模式· 为什么建议你一定要学透设计模式?

“ 【小木箱成长营】设计模式系列文章(排期中)&#xff1a; Android 架构演进 设计模式 Android 常见的 4 种创建型设计模式(上) Android 架构演进 设计模式 Android 常见的 4 种创建型设计模式(下) Android 架构演进 设计模式 Android 常见的 6 种结构型设计模式(上) An…

vue2 中组件的生命周期

目录 一、组件的生命周期 1、什么是组件的生命周期&#xff1f; 2、生命周期的阶段划分&#xff1a; &#xff08;1&#xff09;创建阶段&#xff1a;beforeCreate、created、beforeMount、mounted ​&#xff08;2&#xff09;运行阶段&#xff1a;beforeUpdate、updatev…

【顺序表】数据结构,java代码实现

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f353;&#x1f353;&#x1f353;&#xff0c;顺序表和数组有什么区别呢&#xff0c;我们带着这个疑问去接触顺序表&#xff0c;学习顺序表相关知识。&#x1f680;&#x1f680;&#x1f680; &#x1f9d1;个人主页&am…

商城系统春节氛围营造

春节将至&#xff0c;无论是线上还是线下&#xff0c;都在紧锣密鼓的进行春节营销&#xff0c;线下商家可以通过布置店铺&#xff0c;来营造节日氛围&#xff0c;那对于线上商城来说&#xff0c;又能从哪些方面进行氛围营造呢&#xff1f;今天&#xff0c;我们就以CRMEB Pro版系…

Spring Boot Actuator详解与深入应用(一):Actuator 1.x

《Spring Boot Actuator详解与深入应用》预计包括三篇&#xff0c;第一篇重点讲Spring Boot Actuator 1.x的应用与定制端点&#xff1b;第二篇将会对比Spring Boot Actuator 2.x 与1.x的区别&#xff0c;以及应用和定制2.x的端点&#xff1b;第三篇将会介绍Actuator metric指标…

AWVS扫描报告分析

系列文章 AWVS安装与激活 AWVS扫描Web应用程序 扫描报告分析 生成报告 1.选则我们已经扫描好的网站&#xff0c;点击它 2.点击后&#xff0c;右上角选择生成报告 3.选择生成报告的类型 4.点击生成报告 如下我们分别选择了三种规格生成了三份不同类型的报告 5.点击HTML&…

Vivado

Vivado设计套件&#xff0c;是Xilinx公司最新的为其产品定制的集成开发环境&#xff0c;支持Block Design、Verilog、VHDL等多种设计输入方式&#xff0c;内嵌综合器以及仿真器&#xff0c;可以完成从设计输入、综合适配、仿真到下载的完整FPGA设计流程。 Vivado集成了HLS&…

与机器人chatGPT聊聊软件测试的热门话题

之前我和chatGPT有过一次对话&#xff0c; 那只是问一些有趣的、时髦的大众话题。上周末在家&#xff0c;想考一考chatGPT的软件测试专业水平&#xff0c;确定它是否算得上一名测试专家&#xff1f;通过一系列有难度的提问&#xff0c;感觉有时它答的精妙与全面&#xff0c;但有…

SAP ABAP——SAP包(一)【包概要简述及创建】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

jsp 实验室管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 jsp 实验室管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用…

Node 异步I/O 实现

Node 异步I/O 实现 文章目录Node 异步I/O 实现理想的非阻塞异步 I/O现实的异步I/O实现方案重磅来了 Node 的异步 I/O的实现整个异步 I/O 的过程Node 实现异步 I/O 的总结PS&#xff1a;&#x1f330;理想的非阻塞异步 I/O 但是现实是骨感的&#xff0c;现实的异步I/O实现方案有…

Apache Doris 系列: 基础篇-使用BitMap函数精准去重(1)

1. 简述 精准去重的常用方式是使用SQL函数COUNT(DISTINCT)&#xff0c;这种方法最简单&#xff0c;但是要求所有数据都汇聚在一个节点上计算&#xff0c;在数据量大的情况下&#xff0c;需要等待比较常的时间。 例如一个6000000行数据的表&#xff0c;执行以下SQL&#xff0c;…

模板技术详解

目录 一、概念介绍 二、函数模板 2.1 概念 2.2 函数模板格式 2.3 函数模板原理 2.4 函数模板实例化 2.5 函数模板的匹配原则 三、类模板 3.1 类模板格式 3.2 类模板实例化 四、非类型模板参数 五、模板特化 5.1 概念 5.2 函数模板特化 5.3 类模板特化 六、模板…

如何使用mybatis处理数据库关系中的一对多关系呢?

测试环境的搭建&#xff1a; 本篇文章的测试环境搭建和上篇文章基本相似&#xff0c;这里在上篇文章传送门测试环境的基础上进行对比和修改&#xff01; 上篇文章所提到的多对一是多个学生对应一个老师&#xff0c;是在学生的角度去获取老师的信息&#xff0c;而本篇文章的一…

关于MySQL中的数据类型

一、常见的数据类型有&#xff1a; varchar&#xff08;最长255&#xff09;&#xff1a;【每个长度可以保存一个英文字符或一个汉字】 可变长度字符串 比较智能 节省空间 会根据实际的数据长度动态分配空间 优点&#xff1a;节省空间 缺点&#xff1a;需要动态分配空间&am…

phy-MDC时钟修改

问题分析:我们这边更换一种电平转换芯片&#xff0c;还是没调通。可能一个原因是这个芯片在开漏模式下速速最高到2M有关&#xff0c;您那边能帮忙协调一下&#xff0c;把内核PHY的MDC时钟改为2M以下&#xff0c;另把PHY的复位时间由现在的13MS左右调整到30MS左右我们试一下 在…

数据库知识学习

关系型数据库学习 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录关系型数据库学习一 数据库介绍1 相关定义数据&#xf…

基于卷积神经网络识别金融票据中的文字信息(计算机毕设完整代码可直接运行)

结果展示&#xff1a;用户首先通过”浏览文件”按钮选择扫描获得的金融票据图片. 程序就能够提取出金融票据图片中的日期, 金额等信息和图片路径信息显示在屏幕上. 程序还设置了帮助按键,使用者通过帮助按钮获得帮助.由图可见票据的日期为 19 年 06 月 22 日(062219), 程序可以…