【练习】二分查找思想

news2025/2/22 6:28:42

  • 🎥 个人主页:Dikz12
  • 🔥个人专栏:算法(Java)
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

目录

二分查找算法介绍 

1.二分查找

题目描述 

讲解 

​编辑

代码实现

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

题目描述

​编辑 题解

​编辑 

代码实现

模版总结

3.山脉数组的峰顶索引 

题目描述 

题解 

代码实现 

 4.点名

 题目描述

题解  

代码实现

5.寻找旋转排序数组中的最小值

题目描述 

题解 

代码实现


二分查找算法介绍 

二分查找的使用并不是单单在数组有序的情况下,而是数据能否划分成两段,是否满足“二段性” ;也是细节最多,最容易写出死循环的算法;时间复杂度O(logN),写法模版大致可以分为:

  1. 朴素的二分查找(局限性)
  2. 查找左边界
  3. 查找右边界

写法就在题的里面讲述.

1.二分查找

题目描述 

讲解 

 解法:采用最朴素的二分查找.

  • 定义 left right 指针,分别指向数组的左右区间
  • 找到待查找区间的中间点 mid ,找到之后分三种情况讨论:
  • arr[mid] == target 说明正好找到,返回 mid 的值;
  • arr[mid] > target 说明 [mid, right] 这段区间都是⼤于 target 的,因此舍去右边区间,在左边 [left, mid -1] 的区间继续查找,即让 right = mid - 1 
  • arr[mid] < target 说明 [left, mid] 这段区间的值都是⼩于 target 的,因 此舍去左边区间,在右边 [mid + 1, right] 区间继续查找,即让 left = mid + 1 
  • left right 错开时,说明整个区间都没有这个数,返回 -1

代码实现

    public int search(int[] nums, int target) {
        int left = 0,right = nums.length - 1;  
        while(left <= right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] < target) {
                left = mid + 1;
            }else if(nums[mid] > target) {
                right = mid - 1;
            }else{
                return mid;
            }
        }
        return -1;
    }

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

题目描述

 题解

 解法:采用查找区间的左端点 和 查找区间的右端点.

1.查找区间左端点.

2. 查找区间右端点

 

代码实现

   public int[] searchRange(int[] nums, int target) {
        int[] ret = new int[2];
        ret[0] = ret[1] = -1;
            if(nums.length == 0) {
            return ret;
        }
        //查找左端点
        int left = 0,right = nums.length - 1;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] < target) {
                left = mid + 1;
            }else {
                right = mid;
            }
        }
        if(nums[left] != target) {
            return ret;
        }else{
            ret[0] = right;
        }
        //查找右端点
        // left = 0;
        right = nums.length - 1;
        while(left < right) {
            int mid = left + (right - left + 1) / 2;
            if(nums[mid] <= target) {
                left = mid;
            }else {
                right = mid - 1;
            }
        }
        if(nums[left] != target) {
            return ret;
        }else {
            ret[1] = left;
        }
        return ret;
    }

模版总结

3.山脉数组的峰顶索引 

题目描述 

​​​​​​

题解 

 

代码实现 

    public int peakIndexInMountainArray(int[] arr) {
        // 删去第一个和最后一个
        int left = 1,right =arr.length - 2;
        while(left < right) {
            int mid = left + (right - left + 1) / 2;
            if(arr[mid] > arr[mid - 1]) {
                left = mid;
            }else {
                right = mid - 1;
            }
        }
        return left;
    }

 4.点名

 题目描述

题解  

解一:暴力解法(直接查询)

解二:借助哈希容器

解三:位运算

解四:高斯求和(数学公式)

解五:二分法

代码实现

    public int takeAttendance(int[] records) {
        int left = 0,right = records.length - 1;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(records[mid] == mid) {
                left = mid + 1;
            }else{
                right =mid;
            }
        }
        if(records[left] == left) {
            return left + 1;
        }
        return left;
    }

5.寻找旋转排序数组中的最小值

题目描述 

题解 

代码实现

    public int findMin(int[] nums) {
        int left = 0 ,right = nums.length - 1;
        int tmp = nums[right];
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] > tmp) {
                left = mid + 1;
            }else {
                right = mid;
            }
        }
        return nums[left];
    }

 

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

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

相关文章

【剪映专业版】09定格、倒放、镜像、旋转、裁剪

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 分别为定格、倒放、镜像、旋转、裁剪 定格 时间指示器移动到需要定格的地方&#xff0c;点击定格&#xff0c;自动生成一张图片&#xff0c;时长为3秒。 定格出来的画面&#xff0c;可以任意调整长短时间。 如果需要导…

LeetCode in Python 509. Fibonacci Number (斐波那契数)

斐波那契数实现方式有多种方法&#xff0c;最容易理解的为递归法&#xff0c;也可使用动态规划降低时间复杂度&#xff0c;本文给出递归法和动态规划两种方法的代码实现。 示例&#xff1a; 图1 斐波那契数输入输出示例 方法一&#xff1a;递归法 代码&#xff1a; class …

Flume 入门教程

内容目录 Flume 简介 架构和基本概念 多种架构模式 Flume 安装部署 Flume 简介 Flume 是一个分布式、可靠且高可用的数据收集、聚合和传输系统&#xff0c;主要用于高效地处理大规模日志数据。设计之初&#xff0c;它主要服务于日志管理领域&#xff0c;但其灵活性和可扩展…

什么是SD-WAN

SD-WAN是一种软件定义的广域网技术&#xff0c;通过集中控制和动态路由优化网络性能、可靠性和安全性。它简化了网络管理&#xff0c;提高了连接性和可靠性&#xff0c;适用于各种规模的企业。SD-WAN提供了多种好处&#xff0c;包括降低成本、提高性能、简化管理等。它与物联网…

【系统分析师】系统规划

文章目录 1、项目的机会选择2、可行性分析3、成本效益分析3.1 基本概念3.2 盈亏临界分析3.3 净现值分析3.4 投资回收期 截图&#xff1a;希赛讲义 视频&#xff1a;B站 系统规划对应的是 立项 阶段 1、项目的机会选择 2、可行性分析 3、成本效益分析 3.1 基本概念 例题 3.2 盈…

1.C++入门

1.关键字&#xff08;C98&#xff09; 2.命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存 在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是 对标识符的名称进行本地化 &#xff…

基于springboot实现电影评论网站系统设计项目【项目源码+论文说明】计算机毕业设计

基于springboot实现电影评论网站系统设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了电影评论网站的开发全过程。通过分析电影评论网站管理的不足&#xff0c;创建了一个计算机管理电影评论网站的方案…

component-Echarts柱状图堆叠图与折线图的实现

1.效果 2.​​​​​代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>ECharts 实例</title><!-- 引入 echarts.js --><script src"https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js&…

Linux笔记之查看docker容器目录映射

Linux笔记之查看docker容器目录映射 —— 2024-04-15 code review! docker inspect 容器ID或容器名 | grep -A 20 Mounts实践 grep -A 参数详解&#xff1a; grep 的 -A 参数用于在输出中包括匹配行后的指定数目的行。 使用 -A 参数 该参数的基本语法如下&#xff1a; …

靠谱教育,信赖梵宁——辽宁梵宁教育设计培训风采展示

在快速发展的现代社会&#xff0c;教育已经成为每个人成长道路上不可或缺的一环。而辽宁梵宁教育&#xff0c;以其靠谱的教育理念和专业的设计培训&#xff0c;赢得了广大学员的信赖和好评。今天&#xff0c;就让我们一起走进辽宁梵宁教育&#xff0c;领略其设计培训的风采。 …

Linux_CentOS7/8系统 - 关闭图形界面新增用户机制手册

Linux_CentOS7/8系统 - 关闭图形界面新增用户机制手册 在系统完成图形界面安装后重新启动后第一次登入&#xff0c;在图形界面会有新增用户页面&#xff0c;那如果取消关闭可以按以下操作&#xff1a; CTRLALTF2 root账号登录 yum remove gnome-initial-setup -y init 3 init …

基于SpringBoot+Vue的民宿在线预定平台(含源码数据库+文档免费送)

基于SpringBootVue的民宿在线预定平台&#xff08;含源码数据库文档免费送&#xff09; 项目视频演示&#xff1a; 基于SpringBootVue的民宿在线预定平台 开发系统:Windows10 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql8.0 数据库可视化工…

OpenHarmony实战开发-如何实现防盗链应用功能。

介绍 目前许多网络图片资源有防盗链功能&#xff0c;需要在请求头中设置正确的Referer。本模块使用了第三方库imageknife&#xff0c;通过在请求头中添加Referer来获取防盗链图片功能。同时我们可以设置请求头中的其他参数&#xff0c;比如User-Agent来设置客户端&#xff0c;…

【python】flask中ORM工具SQLAIchemy,各种数据查询操作详细解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

在Windows中使用WSL访问EXT4分区的完整指南

目录标题 1. 挂载步骤2. 卸载步骤3.在wsl中配置分区自动加载 众所周知&#xff0c;要想在windows上面访问ext4 linux分区还是很费劲的。之前有开源的ext2fsd方案&#xff0c;或者用paragon提供的付费版本的Paragon ExtFS。前者已经很久没有更新了&#xff0c;稳定性和可靠性是个…

云轴科技ZStack入选中国信通院《高质量数字化转型产品及服务全景图(2023年度)》

近日&#xff0c;由中国互联网协会主办、中国信通院承办的“2024高质量数字化转型创新发展大会”暨“铸基计划”年度会议在北京成功召开。 本次大会发布了2024年度行业数字化转型趋势&#xff0c;总结并展望了“铸基计划”2023年取得的工作成果及2024年的工作规划。同时&#…

Object.assign()用法及详细分析到底是浅拷贝还是深拷贝?

Object.assign方法用于对象的合并&#xff0c;将源对象&#xff08;source &#xff09;的所有可枚举属性&#xff0c;复制到目标对象&#xff08;target&#xff09;。 Object.assign(target,source1,source2) Object.assign方法的第一个参数是目标对象&#xff0c;后面的参数…

SD-WAN解决电商企业海外业务网络难题

全球化背景下&#xff0c;众多国内企业都涉及到海外贸易业务&#xff0c;尤其是出海电商得到蓬勃发展。企业做出海电商&#xff0c;需要访问国外网页、社交平台&#xff0c;如亚马逊、TikTok、Facebook、YouTube等与客户沟通互动&#xff0c;SD-WAN的发展正好为解决国际网络访问…

43.HarmonyOS鸿蒙系统 App(ArkUI)@State$单引号引用变量失败--解决方法

HarmonyOS鸿蒙系统 App(ArkUI)$单引号引用变量失败--解决方法 State name2:string 反引号键 $加大括号来引用变量&#xff0c;不是使用的单引号&#xff0c;而是反引号&#xff0c;在键盘的Esc键的下面 Entry Componentstruct Index {State message: string Hello WorldStat…

鸿蒙TypeScript学习第19天【命名空间】

1、TypeScript 命名空间 命名空间一个最明确的目的就是解决重名问题。 假设这样一种情况&#xff0c;当一个班上有两个名叫小明的学生时&#xff0c;为了明确区分它们&#xff0c;我们在使用名字之外&#xff0c;不得不使用一些额外的信息&#xff0c;比如他们的姓&#xff0…