【Hot 100 刷题计划】 LeetCode 240. 搜索二维矩阵 II | C++ 巧妙利用单调性 (BST 法)

LeetCode 240. 搜索二维矩阵 II

📌 题目描述

题目级别:中等

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。

  • 每列的元素从上到下升序排列。

  • 示例 1:

    输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5

    输出:true


💡 破题思路:站在右上角,把矩阵看作二叉搜索树 (BST)

这道题虽然行和列都是单调递增的,但上一行的末尾不一定小于下一行的开头,因此整体不具备绝对的一维单调性,无法直接套用全局二分查找。

破局点在于选择"正确的起跑线"!

如果我们在左上角起跑,往右是变大,往下也是变大,一旦当前值小于目标值,我们根本不知道该往右走还是往下走。

但如果我们站在矩阵的右上角,奇妙的物理性质出现了:

  • 向左走 :同一行中,左边的元素一定比当前
  • 向下走 :同一列中,下边的元素一定比当前

这不就是一棵**二叉搜索树(BST)**吗!当前元素就是根节点,左边的行就是左子树,下边的列就是右子树。

核心运作机制:

  1. 从右上角 (0, n-1) 开始搜寻。
  2. 如果 当前值 == target,直接找到,返回 true
  3. 如果 当前值 > target,说明目标值不可能在当前列的下方,我们应该向左移动 (剔除当前列),即 j--
  4. 如果 当前值 < target,说明目标值不可能在当前行的左方,我们应该向下移动 (剔除当前行),即 i++
  5. 当越界时说明矩阵中不存在该目标值,返回 false

💻 C++ 代码实现 (极简贪心法)

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        if (m == 0) return false;
        int n = matrix[0].size();

        // 将起点设置在矩阵的右上角
        int i = 0, j = n - 1;

        // 只要没有越过矩阵的左边界和下边界,就继续搜索
        while (i < m && j >= 0)
        {
            if (matrix[i][j] == target) {
                return true;  // 命中靶心
            }
            if (matrix[i][j] > target) {
                j--;  // 当前值太大了,往左走寻找更小的值
            }
            else {
                i++;  // 当前值太小了,往下走寻找更大的值
            }
        }

        // 走出矩阵也没找到,说明不存在
        return false;
    }
};
相关推荐
evans在进步19 小时前
LeetCode 34:在排序数组中查找元素的首尾位置——Java 两次二分查找详解
java·python·leetcode
小则又沐风a19 小时前
负载均衡式在线OJ---------第二幕
linux·c++·后端
a35354138219 小时前
C++项目如何架构优化
java·c++·架构
键盘会跳舞19 小时前
C++:智能指针源码级深度拆解——从 RAII 思想到引用计数的内存安全体系
c++·智能指针·unique_ptr·shared_ptr·weak_ptr
SNAKEpc1213820 小时前
OpenGL(十三)- Mip贴图
c语言·c++·图形渲染·贴图
杨航 AI21 小时前
** AI 面试算法 50 题清单**,不是单纯的 LeetCode 题号列表,而是按照“**考察概率 × 面试价值 × 你当前准备方向**”排序
算法·leetcode·面试
.道阻且长.1 天前
5.LeetCode算法习题讲解--双指针--有效三角形的个数
算法·leetcode·职场和发展
会周易的程序员1 天前
aiDgePLC — IEC61131-3 ST PLC 虚拟机调试与运行环境
c++·物联网·虚拟机·st·工业协议·iec61131·梯形图
xin_nai1 天前
LeetCode热题100(Java)(7)链表(下)
java·leetcode·链表
想吃火锅10051 天前
【leetcode】54. 螺旋矩阵
算法·leetcode·矩阵