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

server/2024/11/14 2:37:34/

目录

  • 一、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。

解题代码:

java">//时间复杂度: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循环遍历数组,该下标元素大于前面和后面元素,返回下标。
  • 因为这个数组一定是一个山脉数组,所以不用管数组头和尾。

解题代码:

java">//时间复杂度: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

解题代码:

java">//时间复杂度: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 暴力枚举

解题思路:

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

解题代码:

java">//时间复杂度: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]才是最小值。

解题代码:

java">//时间复杂度: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 暴力枚举

解题思路;

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

解题代码:

java">//时间复杂度: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。

解题代码:

java">//时间复杂度: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中出现过的元素。

解题代码:

java">//时间复杂度: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不在数组中。

解题代码:

java">//时间复杂度: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的数全部异或。
  • 在于数组元素进行异或。

解题代码:

java">//时间复杂度: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的和求出来。
  • 在减去数组中的元素即可。

解题代码:

java">//时间复杂度: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.ppmy.cn/server/141317.html

相关文章

计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

机器学习(基础1)

数据集 sklearn玩具数据集 数据量小&#xff0c;数据在sklearn库的本地&#xff0c;只要安装了sklearn&#xff0c;不用上网就可以获取 sklearn现实世界数据集 数据量大&#xff0c;数据只能通过网络获取&#xff08;为国外数据集&#xff0c;下载需要梯子&#xff09; skle…

抓包分析:wireshark抓不到TLS1.3数据包中证书的解决方案

近日工作中遇到需要分析使用TLS1.3协议进行通信的数据包的情况&#xff0c;但使用wireshark进行分析发现不能抓到服务端证书&#xff0c;感到诧异遂设法解决 这篇博客给出解决方案&#xff0c;和简单的原理分析 解决方案&#xff1a; 第一步&#xff1a;在任意合适路径新建一…

Ubuntu20.04离线安装nginx

文章目录 一、gcc/g、make依赖包安装1.1 在有网的ubuntu机器上下载依赖包1.2 离线安装依赖包 二、nginx相关依赖包安装2.1 有网机器上下载安装包2.2 上传压缩包并解压2.3 安装pcre2.4 安装zlib2.5 安装openssl2.6 安装nginx 三、nginx启动验证 一、gcc/g、make依赖包安装 1.1 …

【智慧出行】微信小程序智慧旅游服务平台,轻松规划旅程

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

【神经科学学习笔记】基于分层嵌套谱分割(Nested Spectral Partition)模型分析大脑网络整合与分离的局部指标(二)

前言 1.学习背景 前几天笔者学习使用NSP (Network Segregation and Partnership) 算法计算大脑整合分离的全局指标&#xff0c;现在要在之前学习的基础上再来玩玩局部指标。 局部指标的计算主要在两个层面上进行&#xff1a;第一个层面是针对每个独立ROI的指标计算&#xff0…

解决”重复文件名重命名“问题【根据Word系统方式】

提示&#xff1a;工作中遇到的功能需求&#xff0c;在此记录&#xff0c;不喜勿喷&#xff01;谢谢 文章目录 前言一、需求分析二、需求实现 前言 最近工作中遇到的我认为有必要记录的需求实现&#xff0c;希望可以帮助到有同样需求的小伙伴们&#xff01; 提示&#xff1a;以…

Axure大屏可视化模板:赋能各行各业的数据展示与管理

如何高效、直观地展示和分析数据&#xff0c;成为企业和机构面临的重要挑战。Axure大屏可视化模板作为一种先进的数据展示工具&#xff0c;凭借其强大的交互性和直观性&#xff0c;在多个领域内得到了广泛应用。从农业生产的智能化管理到城市发展的精细化管理&#xff0c;再到企…