Hot100-Day12-T74搜索二维矩阵

0 阅读1分钟

Day12[26/3/12]T74搜索二维矩阵

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

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false

示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

解题思路

先对第一列进行二维搜索,查找下边界,也就是找到行 row使得 matrix[row][0] <= traget <matrix[row+1][0]

再对这一行内进行搜索,确定有无对应元素。(这就不是查找下边界了!)

此外还考虑一些特别的情况,比如说 matrix = [[1]], target = 0.

Code

#include <iostream>
#include <vector>

using namespace std;

class Solution
{
public:
    bool searchMatrix(vector<vector<int>> &matrix, int target)
    {
        // 先算在哪一行
        int left = -1;
        int right = matrix.size();
        int row;

        while (left + 1 < right)
        {
            int middle = (left + right) / 2;
            if (matrix[middle][0] == target)
            {
                return true;
            }
            else if (matrix[middle][0] > target)
            {
                right = middle;
            }
            else
            {
                left = middle;
            }
        }
        row = left;

        if (row < 0)
        {
            return false;
        }

        // 对行内进行二分查找
        left = 0;
        right = matrix[0].size() - 1;
        while (left <= right)
        {
            int middle = (left + right) / 2;
            if (matrix[row][middle] == target)
            {
                return true;
            }
            else if (matrix[row][middle] > target)
            {
                right = middle - 1;
            }
            else
            {
                left = middle + 1;
            }
        }

        return false;
    }
};

auto main() -> int
{
    vector<vector<int>> matrix{
        {1, 3, 5, 7},
        {10, 11, 16, 20},
        {23, 30, 34, 60},
    };
    int target = 3;

    Solution sol;
    cout << sol.searchMatrix(matrix, target) << endl;
}