74. 搜索二维矩阵

问题

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

分析

先找哪一行,再找哪一列。两次二分即可。同样,开区间二分好写好理解。

代码

class Solution {
public:
    vector<vector<int>> g;
    int target;
    int n = 0, m = 0;
    bool res = false;
    void bi_search() {
        int l = -1, r = n;
        while(l+1 < r) {
            int mid = (l+r) >> 1;
            if (g[mid][0] > target) {
                r = mid;
            } else {
                l = mid;
            }
        }
        if (l < 0 || l >= n) {res = false; return ;}
        int l_row = -1, r_row = m;
        while(l_row+1 < r_row) {
            int mid = (l_row + r_row) >> 1;
            if (g[l][mid] >= target) {
                r_row = mid;
            } else {
                l_row = mid;
            }
        }
        // 由于是开区间,这里要加r_row < m,防止本来右指针就没动。这里判断谁就限制谁,如果用到l_row就限制l_row >-1
        if (r_row<m && g[l][r_row] == target) {
            res = true;
        } else {
            res = false;
        }
        return ;
    }
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        this->g = matrix;
        this->target = target;
        n = matrix.size();
        m = matrix[0].size();
        bi_search();
        return res;
    }
};
posted @ 2025-06-08 13:57  saulstavo  阅读(17)  评论(0)    收藏  举报