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.lengthn == matrix[i].length1 <= 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;
}