【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;
    }
};
相关推荐
故事还在继续吗15 小时前
C++多线程与多进程编程
开发语言·c++
晓py15 小时前
highpool测试报告
c++
liuyao_xianhui15 小时前
进程概念与进程状态_Linux
linux·运维·服务器·数据结构·c++·哈希算法·宽度优先
迷途之人不知返15 小时前
List的模拟实现
数据结构·c++·学习·list
无敌秋16 小时前
C++ 抽象工厂模式实战指南
开发语言·c++·抽象工厂模式
CoderMeijun16 小时前
C++ 智能指针:auto_ptr
c++·内存管理·智能指针·raii·auto_ptr
wuminyu16 小时前
专家视角看Lambda表达式的原理解析
java·linux·c语言·jvm·c++
ximu_polaris16 小时前
设计模式(C++)-行为型模式-命令模式
c++·设计模式·命令模式
6Hzlia16 小时前
【Hot 100 刷题计划】 LeetCode 189. 轮转数组 | C++ 三次反转经典魔法 (O(1) 空间)
c++·算法·leetcode
淀粉肠kk16 小时前
【C++11】智能指针详解
开发语言·c++