前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【LeetCode 热题 100】搜索插入位置 / 搜索旋转排序数组 / 寻找旋转排序数组中的最小值

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

作者头像
_小羊_
发布于 2025-05-17 02:15:48
发布于 2025-05-17 02:15:48
7400
代码可运行
举报
文章被收录于专栏:C++C++
运行总次数:0
代码可运行

搜索插入位置

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
};

搜索二维矩阵

每行进行一次二分查找。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
};

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
};

在排序数组中查找元素的第一个和最后一个位置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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};
    }
};

搜索旋转排序数组
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
};

寻找旋转排序数组中的最小值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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];
    }
};

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 搜索二维矩阵
  • 在排序数组中查找元素的第一个和最后一个位置
  • 搜索旋转排序数组
  • 寻找旋转排序数组中的最小值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档