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

【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.lryc.cn/news/2378920.html

相关文章:

  • 副业小程序YUERGS,从开发到变现
  • 计算机视觉与深度学习 | Python实现EMD-VMD-LSTM时间序列预测(完整源码和数据)
  • 基于LLM合成高质量情感数据,提升情感分类能力!!
  • 网络检测工具InternetTest v8.9.1.2504 单文件版,支持一键查询IP/DNS、WIFI密码信息
  • SpringBoot中使用Flux实现流式返回的技术总结
  • 【网络编程】十、详解 UDP 协议
  • 从零开始理解Jetty:轻量级Java服务器的入门指南
  • python05——循环结构
  • windows触摸板快捷指南
  • STM32 ADC 模数转换器详解:原理、配置与应用
  • [目标检测] YOLO系列算法讲解
  • React 中,闭包陷阱
  • .NET NativeAOT 指南
  • uniapp-商城-57-后台 新增商品(弹窗属性数据添加父级)
  • 摩方 12 代 N200 迷你主机(Ubuntu 系统)WiFi 抓包环境配置教程
  • matlab多智能体网络一致性研究
  • Unity(URP渲染管线)的后处理、动画制作、虚拟相机(Virtual Camera)
  • C语言:在 Win 10 上,gcc 如何编译 gtk 应用程序
  • 阿里云CMH镜像迁移与SMC整机迁移对比及功能详解(同地域跨主体账号场景)
  • 用vue和go实现登录加密
  • 政府数据开放试点企业如何抢占特许经营协议黄金席位
  • CSS 锚点滑动效果的技术
  • mac-M系列芯片安装软件报错:***已损坏,无法打开。推出磁盘问题
  • Echart地图数据源获取
  • GNSS数据自动化下载系统的设计与实现
  • MySQL 中 JOIN 和子查询的区别与使用场景
  • 【深度学习-Day 12】从零认识神经网络:感知器原理、实现与局限性深度剖析
  • 谈谈未来iOS越狱或巨魔是否会消失
  • Unity3D仿星露谷物语开发43之农作物生长
  • 从0到1上手Kafka:开启分布式消息处理之旅