当前位置: 首页 > news >正文

【LeetCode 热题 100】搜索插入位置 / 搜索旋转排序数组 / 寻找旋转排序数组中的最小值

头像
⭐️个人主页:@小羊
⭐️所属专栏:LeetCode 热题 100
很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

动图描述

目录

      • 搜索插入位置
      • 搜索二维矩阵
      • 在排序数组中查找元素的第一个和最后一个位置
      • 搜索旋转排序数组
      • 寻找旋转排序数组中的最小值


搜索插入位置

  • 搜索插入位置

在这里插入图片描述

为什么最后可以直接 return l,如果没找到目标值,则会由 l > r 出循环。如果是由 r = mid - 1 出的循环,说明此时 mid == l 且所指位置就是要插入的位置;如果是由 l = mid + 1 出的循环,mid所指的元素刚好小于目标值,则出循环后l所指的就是需要插入的位置。

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1;while (l <= r){int mid = (l + r) / 2;if (nums[mid] > target) r = mid - 1;else if (nums[mid] < target) l = mid + 1;else return mid;}return l;}
};

搜索二维矩阵

  • 搜索二维矩阵

在这里插入图片描述

每行进行一次二分查找。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size(), n = matrix[0].size();for (int i = 0; i < m; i++){int l = 0, r = n - 1;while (l <= r){int mid = (l + r) / 2;if (matrix[i][mid] < target) l = mid + 1;else if (matrix[i][mid] > target) r = mid - 1;else return true;}}return false;}
};

将二维数组看作一维数组进行二分。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size(), n = matrix[0].size();int l = 0, r = m * n - 1;while (l <= r){int mid = l + (r - l) / 2;int t = matrix[mid / n][mid % n];if (t < target) l = mid + 1;else if (t > target) r = mid - 1;else return true;}return false;}
};

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

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

在这里插入图片描述

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {if (nums.empty()) return {-1, -1};int l = 0, r = nums.size() - 1;while (l < r){int mid = l + (r - l) / 2;if (nums[mid] < target) l = mid + 1;else r = mid;}if (nums[l] != target) return {-1, -1};int begin = l;r = nums.size() - 1;while (l < r){int mid = l + (r - l + 1) / 2;if (nums[mid] > target) r = mid - 1;else l = mid;}return {begin, r};}
};

搜索旋转排序数组

  • 搜索旋转排序数组

在这里插入图片描述

class Solution {
public:int search(vector<int>& nums, int target) {int n = nums.size();int l = 0, r = n - 1;while (l <= r){int mid = l + (r - l) / 2;if (nums[mid] == target) return mid;if (nums[0] <= nums[mid]){if (nums[0] <= target && nums[mid] > target) r = mid - 1;else l = mid + 1;}else{if (target <= nums[n - 1] && nums[mid] < target) l = mid + 1;else r = mid - 1;}}return -1;}
};

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

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

在这里插入图片描述

class Solution {
public:int findMin(vector<int>& nums) {int n = nums.size();int l = 0, r = n - 1;while (l < r){int mid = l + (r - l) / 2;if (nums[mid] < nums[n - 1]) r = mid;else l = mid + 1;}return nums[l];}
};

本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

头像
http://www.dtcms.com/a/195248.html

相关文章:

  • Redis数据结构详解:应用场景与使用指南
  • AUTOSAR图解==>AUTOSAR_SWS_ICUDriver_AUTOSAR_SWS_ICUDriver
  • 新京东,正在成为一种生活方式
  • BM25 算法与关键词提取在向量数据库中的实践优化
  • 架构篇、第五章_05Jenkins的部署与构建
  • 为什么Flexray在渐渐被TSN以太网替代-AI的回答
  • WebGIS开发智慧机场项目实战(2)
  • postgres的docker版本安装
  • SG7050VAN差分晶振,X1G0042810033,EPSON爱普生以太网6G晶振
  • 如何通过URL链接让亚马逊网站返回指定像素大小的产品主图片
  • conda init执行了还是不好用
  • 升级kafka4.0.0,无ZK版本
  • windows编程:LIB和OBJ格式文件解析
  • 如何实现金蝶云星空到MySQL的数据高效集成
  • GTS-400 系列运动控制器板卡介绍(三十三)---运动程序单线程累加求和
  • 小学数学题批量生成及检查工具
  • 如何导出一个python项目中的所有依赖包及其版本信息requirements.txt
  • JS手写代码篇---手写 instanceof 方法
  • 卡尔曼滤波及变种 KF EKF ESKF的区别跟用法
  • 医学图像分析中的大规模基准测试与增强迁移学习|文献速递-深度学习医疗AI最新文献
  • Java【13_1】final、初始化块、继承(测试题)
  • 基于“岗课赛证”融通的中职“综合布线技术”课程解决方案
  • 物联网技术在银行安全用电系统中的应用与实践研究
  • 网络安全-等级保护(等保) 2-6 GB/T 36958—2018 《信息安全技术 网络安全等级保护安全管理中心技术要求》-2018-12-28 发布【现行】
  • 14 C 语言浮点类型详解:类型精度、表示形式、字面量后缀、格式化输出、容差判断、存储机制
  • 【MySQL】索引太多会怎样?
  • Qt图表绘制(QtCharts)- 性能优化(13)
  • 高速光耦在通信行业的应用(五) | 5Mbps通信光耦的特性
  • FEKO许可证与版本兼容性问题
  • PT2062单触控单输出LED调光IC