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