Hot100-Day08-T240二维矩阵搜索

0 阅读1分钟

Day08[26/3/8]T240.搜索二维矩阵

编写一个高效的算法来搜索 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

示例 2:

输入: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 = 20
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • -109 <= matrix[i][j] <= 109
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -109 <= target <= 109

解题思路

先学习搜索二叉树

然后将这个矩阵视为搜索二叉树,具体来说是:

将 [a,b] 视为一个节点,然后 [a-1,b] 是更小的子节点,[a,b+1] 是更大的节点。

也就是将最右上角的视为根节点,往左一个找更小的,往下一个找更大的。

Code

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>

class Solution
{
public:
    bool searchMatrix(vector<vector<int>> &matrix, int target)
    {
        // 1. 从最右上角开始
        int i = 0;
        int j = matrix[0].size() - 1;

        // 2. 搜索
        while (i < matrix.size() && j >= 0)
        {
            if (matrix[i][j] == target)
            {
                return true;
            }
            else if (matrix[i][j] > target)
            {
                j--;
            }
            else
            {
                i++;
            }
        }

        // 3. 没搜到就是没有
        return false;
    }
};

int main()
{
    vector<vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}};

    int target = 5;

    Solution sol;

    if (sol.searchMatrix(matrix, target))
        cout << "True";
    else
        cout << "False";

    return 0;
}