LeetCode HOT100 - 搜索二维矩阵 II

因为 n, m 都挺小的,只有 300,所以暴力一点也没什么问题

比如直接查找,或者按照行的开头元素进行二分搜索来缩小一些范围

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& a, int x) {
        int n = a.size();
        int m = a[0].size();
        vector<int> aa(n);
        for (int i = 0; i < n; i++) {
            aa[i] = a[i][0];
        }
        int it = upper_bound(aa.begin(), aa.end(), x) - aa.begin() - 1;
        if (it == -1) {
            return false;
        }
        for (int i = 0; i <= it; i++) {
            int j = lower_bound(a[i].begin(), a[i].end(), x) - a[i].begin();
            if (j == m) continue;
            if (a[i][j] == x) return true;
        }
        return false;
    }
};

官方题解则是有一个对横向和纵向的递增信息都利用的方法

看 (i, j) ,若 i, j 大于 target,那么 (i, j) ~ (n, m) 这个矩形一定大于 target

当然仅是这样的话,还有左上,右上,左下等等可能

所以我们搜索的顺序要做一定的限制,具体来说,是从 (0, m - 1) 开始

这样,如果大于的话,就只可能在左侧了,因为右侧相当于我们都遍历过了

如果小于,类似的,只可能在下方了

也就是按照对角线的方向逐步减小未搜索过的矩形区域

posted @ 2026-04-06 16:32  rdcamelot  阅读(18)  评论(0)    收藏  举报