【算法】【优选算法】二分查找算法(下)

目录

  • 一、852.⼭脉数组的峰顶索引
    • 1.1 二分查找
    • 1.2 暴力枚举
  • 二、162.寻找峰值
    • 2.1 二分查找
    • 2.2 暴力枚举
  • 三、153.寻找旋转排序数组中的最⼩值
    • 3.1 二分查找
    • 3.2 暴力枚举
  • 四、LCR 173.点名
    • 4.1 二分查找
    • 4.2 哈希表
    • 4.3 暴力枚举
    • 4.4 位运算
    • 4.5 数学(求和)

一、852.⼭脉数组的峰顶索引

题目链接:852.⼭脉数组的峰顶索引
题目描述:

题目解析:

  • 给我们一个数组,元素是先递增在递减的,让我们返回最大元素下标。

1.1 二分查找

解题思路:

  • 我们这个数组本来就是一个被天然分成两段,递增区间和递减区间,的数据,天然使用二分查找的题。
  • 当mid的元素小于后一个元素的时候,mid在递增区间,所以left = mid + 1。
  • 当mid的元素大于后一个元素的时候,mid在递减区间,所以right = mid。

解题代码:

//时间复杂度:O(logN)
//空间复杂度:O(1)
class Solution {public int peakIndexInMountainArray(int[] arr) {int left = 0;int right = arr.length-1;while(left < right) {int mid = left + (right - left) / 2;if(arr[mid] < arr[mid+1]) left = mid + 1;else right = mid;}return left;}
}

1.2 暴力枚举

解题思路:

  • 直接使用for循环遍历数组,该下标元素大于前面和后面元素,返回下标。
  • 因为这个数组一定是一个山脉数组,所以不用管数组头和尾。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {public int peakIndexInMountainArray(int[] arr) {for(int i = 1; i < arr.length - 1; i++) {if(arr[i] > arr[i-1] && arr[i] > arr[i+1]) return i;}return 0;}
}

二、162.寻找峰值

题目链接:162.寻找峰值
题目描述;

题目解析:

  • 给我们的数组是,递增递减反复进行,让我们找到其中一个峰值的下标。
  • 数组可能是这几个情况:1 . /\/\/\ ,2. / ,3. \

2.1 二分查找

解题思路:

  • 其实我们可以将数组分为,有要求峰值和没有要求峰值两段,因为给了峰值不等于下一个元素。
  • 所以当mid小于下一个元素的时候,mid就是在没有要求峰值那段,left = mid+1。
  • 当mid大于下一个元素的时候,mid就是在有峰值那段,right = mid

解题代码:

//时间复杂度:O(logN)
//空间复杂度:O(1)
class Solution {public int findPeakElement(int[] nums) {int left = 0;int right = nums.length - 1;while(left < right) {int mid = left + (right - left) / 2;if(nums[mid] < nums[mid + 1]) left = mid + 1;else right = mid; }return left;}
}

2.2 暴力枚举

解题思路:

  • 直接转变为求数组最大值下标,遍历数组即可。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {public int findPeakElement(int[] nums) {int ret = 0;for(int i = 0; i < nums.length; i++) {if(nums[i] > nums[ret])  ret = i;}return ret;}
}

三、153.寻找旋转排序数组中的最⼩值

题目链接:153.寻找旋转排序数组中的最⼩值
题目描述:

题目解析:

  • 数组旋转一次就代表将数组尾元素放在数组头。
  • 给我们一个原来升序的数组,旋转多次后,找到数组中最小元素下标。
  • 数组中元素各不相同。
  • 数组会是下面这种状态或者一个完全递增的状态

3.1 二分查找

解题思路:

  • 我们这个数组本来就是已经是被分成两段了的。
  • 我们可以使用nums[ 0 ]或者nums[ nums.length - 1 ]来当分界线。
  • 使用nums[ nums.length - 1 ]为界限:
    • mid元素大于等于界限时,在数组段1,所以left = mid + 1。
    • mid元素小于界限的时候,在数组段2,所以right = mid。
  • 使用nums[ 0 ]为界限:
    • mid元素大于等于界限时,在数组段1,所以left = mid + 1。
    • mid元素小于界限的时候,在数组段2,所以right = mid。
    • 考虑数组完全递增时,nums[0]才是最小值。

解题代码:

//时间复杂度:O(logN)
//空间复杂度:O(1)
//使用nums[ nums.length - 1 ]为界限:
class Solution {public int findMin(int[] nums) {int left  = 0;int right = nums.length - 1;while(left < right) {int mid = left + (right - left) / 2;if(nums[mid] < nums[nums.length-1]) right = mid;else left = mid + 1;}return nums[left];}
}
//使用nums[ 0 ]为界限:
class Solution {public int findMin(int[] nums) {int left  = 0;int right = nums.length - 1;while(left < right) {int mid = left + (right - left) / 2;if(nums[mid] >= nums[0]) left = mid + 1;else right = mid;}if(nums[0] < nums[left]) left = 0;return nums[left];}
}

3.2 暴力枚举

解题思路;

  • 直接循环遍历数组找最小值即可。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {public int findMin(int[] nums) {int ret = nums[0];for(int i = 0; i < nums.length; i++) {if(nums[i] < ret) ret = nums[i];}return ret;}
}

四、LCR 173.点名

题目链接:LCR 173.点名
题目描述:

题目解析:

  • 给你一个长度为n数组,这个数组中有0到n中的数,按升序排列,找出数组在0到n中不含有的数。

4.1 二分查找

解题思路:

  • 这个数组分为这样两段,一段是下标与元素值相同的,一段是下标是元素值减1。
  • 所以当mid元素等于mid的时候,落在第一段,left = mid + 1;
  • 当mid元素不等于mid的时候,落在第二段,right = mid。

解题代码:

//时间复杂度:O(logN)
//空间复杂度:O(1)
class Solution {public int takeAttendance(int[] records) {int left = 0;int right = records.length;while(left < right) {int mid = left + (right - left) / 2;if(records[mid] == mid) left = mid + 1;else right = mid;}return left;}
}

4.2 哈希表

解题思路:

  • 借助一个数组来标记0到n中出现过的元素。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {public int takeAttendance(int[] records) {int[] hash = new int[records.length + 1];for(int i = 0; i < records.length; i++) {hash[records[i]]++;}for(int i = 0; i < hash.length; i++) {if(hash[i] == 0) return i;}return 0;}
}

4.3 暴力枚举

解题思路:

  • 直接遍历数组,当出现第一个下标和元素不相等的直接返回元素减一即可。
  • 遍历完数组还是没找到,证明是0到n中n不在数组中。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {public int takeAttendance(int[] records) {for(int i = 0; i < records.length; i++) {if(records[i] != i) return records[i]-1;}return records.length;}
}

4.4 位运算

解题思路:

  • 直接使用一个变量来将0到n的数全部异或。
  • 在于数组元素进行异或。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {public int takeAttendance(int[] records) {for(int i = 0; i < records.length; i++) {if(records[i] != i) return records[i]-1;}return records.length;}
}

4.5 数学(求和)

解题思路:

  • 直接先将0到n的和求出来。
  • 在减去数组中的元素即可。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {public int takeAttendance(int[] records) {int n = records.length;int ret = (n*(n+1))/2;for(int i = 0; i < records.length; i++) {ret = ret - records[i];}return ret;}
}

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

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

相关文章

递归函数学习 part1

一&#xff0c;初始递归&#xff1a;阶乘 1&#xff0c;原理 n的阶乘等于n乘以n-1的阶乘&#xff0c;而0的阶乘等于1. 2&#xff0c;代码展示 #include <iostream> using namespace std;int fact(int); int main() {cout<<fact(5);return 0; }int fact(int n) …

开源 - Ideal库 -获取特殊时间扩展方法(四)

书接上回&#xff0c;我们继续来分享一些关于特殊时间获取的常用扩展方法。 01、获取当前日期所在月的第一个指定星期几 该方法和前面介绍的获取当前日期所在周的第一天&#xff08;周一&#xff09;核心思想是一样的&#xff0c;只是把求周一改成求周几而已&#xff0c;当然其…

Python练习18

Python日常练习 题目&#xff1a; 请编fun函数&#xff0c;求44整型数组的主对角线元素的和。 说明&#xff1a; 如下图所示为一个44整型数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 测试用例&#xff1a; 1 2 3 4 5 6 7 8…

智防未戴帽,安全无死角

在追求高效与安全并重的现代工业环境中&#xff0c;员工佩戴安全帽作为最基本的防护措施&#xff0c;其重要性不言而喻。为了有效杜绝员工未佩戴安全帽的现象&#xff0c;我们提出了一套以AI视频分析与安全教育培训系统为核心的综合解决方案&#xff0c;旨在通过智能化手段与系…

C++ 优先算法 —— 四数之和(双指针)

目录 题目&#xff1a;四数之和 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 双指针算法 不漏的处理&#xff1a; 去重处理&#xff1a; 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 双指针算法 题目&#xff1a;四数之和 1. 题目解析 题目截图&#xff1a; 这道题与三数之和&am…

[vulnhub] Corrosion: 2

https://www.vulnhub.com/entry/corrosion-2,745/ 提示&#xff1a;枚举才是神 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是6 &#xff0c;kali是10 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) …

前端请求后端php接口跨域 cors问题

只需要后端在网站的入口文件 一般都是 index.php 加上 这几行代码就可以了 具体的参数可以根据需要去修改 header("Access-Control-Allow-Origin: *"); header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS); header(Access-Control-Allow-Heade…

【星闪EBM-H63开发板】AT固件的配置与测试

引言 前面的博客已经介绍了【星闪EBM-H63开发板】小熊派固件中心的使用_bearpi-bm h63固件烧录工具-CSDN博客和【星闪EBM-H63开发板】固件的烧录-CSDN博客&#xff0c;今天来测试一下另一种固件&#xff0c;也就是AT固件。有关AT固件的介绍参见&#xff1a;【星闪EBM-H63开发板…

Linux基础(十四)——BASH

BASH 1.BASH定义2.shell的种类3.bash的功能3.1 命令记录功能3.2 命令补全功能3.3 命令别名设置3.4 工作控制、 前景背景控制3.5 程序化脚本&#xff1a; &#xff08; shell scripts&#xff09;3.6 万用字符 4.bash的内置命令5.shell的变量功能5.1 变量的取用5.2 新建变量5.3 …

【前端学习笔记】JavaScript学习一【变量与数据类型】

一、变量 变量是计算机中用来存储数据的“容器”&#xff0c;通俗的理解变量就是使用【某个符号】来代表【某个具体的数值】&#xff08;数据&#xff09; 声明&#xff1a;声明(定义)变量有两部分构成&#xff1a;关键字 变量名 JavaScript 使用关键字 let 和 var 来声明&am…

使用Git工具在GitHub的仓库中上传文件夹(超详细)

如何使用Git工具在GitHub的仓库中上传文件夹&#xff1f; 如果觉得博主写的还可以&#xff0c;点赞收藏关注噢~ 第一步&#xff1a;拥有一个本地的仓库 可以fork别人的仓库或者自己新创建 fork别人的仓库 或者自己创建一个仓库 按照要求填写完成后&#xff0c;点击按钮创建…

Linux kernel 堆溢出利用方法(二)

前言 本文我们通过我们的老朋友heap_bof来讲解Linux kernel中off-by-null的利用手法。在通过讲解另一道相对来说比较困难的kernel off-by-null docker escape来深入了解这种漏洞的利用手法。&#xff08;没了解过docker逃逸的朋友也可以看懂&#xff0c;毕竟有了root权限后&a…

福昕阅读器高级版解决文件上传IEEE PDF eXpress字体未嵌入

文件上传IEEE PDF eXpress字体未嵌入问题 Errors: Font Arial-BoldMT, Arial-ItalicMT, ArialMT is not embedded (93x on pages 2-3,5) 因为没安装adobe&#xff0c;尝试使用福昕阅读器高级版解决&#xff08;学校统一买的&#xff0c;不知道普通版行不行&#xff09; 找到潜…

人工智能在智能家居的应用

AI 在智能家居场景中&#xff0c;一方面将进一步推动家居生活产品的智能化&#xff0c;包 括照明系统、音箱系统、能源管理系统、安防系统等&#xff0c;实现家居产品从感知到认知再到决策的 发展&#xff1b;另一方面在于智能家居系统的建立&#xff0c;搭载人工智能的多款产品…

如何管理好自己的LabVIEW项目

在LabVIEW项目开发中&#xff0c;项目管理对于提高开发效率、确保项目质量、减少错误和维护成本至关重要。以下从项目规划、代码管理、测试与调试、版本控制、团队协作等方面&#xff0c;分享LabVIEW项目管理的体会。 ​ 1. 项目规划与需求分析 关键步骤&#xff1a; 需求分析…

51c自动驾驶~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/11638131 #端到端任务 说起端到端&#xff0c;每个从业者可能都觉得会是下一代自动驾驶量产方案绕不开的点&#xff01;特斯拉率先吹响了方案更新的号角&#xff0c;无论是完全端到端&#xff0c;还是专注于planner的模型&a…

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器&#xff0c;将OpenCV中lib库里的o…

蓝牙音响音频功放:【矽源特HAA9809 AB+D类自动切换】

目录 1&#xff1a;HAA9809特性 2&#xff1a;典型应用电路 3&#xff1a;CTRL管脚控制信息 4&#xff1a;一线脉冲控制方式 5&#xff1a;输入电阻&#xff0c;调节放大增益 6&#xff1a;输入电容&#xff0c;调节频响 7&#xff1a;总结 矽源特ChipSourceTek-HAA9809…

大语言模型安全,到底是什么的安全

什么是AI安全 自ChatGPT问世以来&#xff0c;市场上涌现出了众多大型语言模型和多样化的AI应用。这些应用和模型在为我们的生活带来便利的同时&#xff0c;也不可避免地面临着安全挑战。AI安全&#xff0c;即人工智能安全&#xff0c;涉及在人工智能系统的开发、部署和使用全过…

云岚到家 秒杀抢购

目录 秒杀抢购业务特点 常用技术方案 抢券 抢券界面 进行抢券 我的优惠券列表 活动查询 系统设计 活动查询分析 活动查询界面显示了哪些数据&#xff1f; 面向高并发如何提高活动查询性能&#xff1f; 如何保证缓存一致性&#xff1f; 数据流 Redis数据结构设计 如…