搜索二维矩阵 II
- 题解1 对角线上下循环搜索(超时)
- 生气!!无脑循环都不超时
- 题解2 无脑循环
- 题解3 学习STL(二分查找)
编写一个高效的算法来搜索
m x n
矩阵
matrix
中的一个目标值
target
。该矩阵具有以下特性:
- 每行的元素从左到右升序排列
- 每列的元素从上到下升序排列
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= n, m <= 300
- − 1 0 9 -10^9 −109 <= matrix[i][j] <= 1 0 9 10^9 109
- 每行的所有元素从左到右升序排列 每列的所有元素从上到下升序排列
- − 1 0 9 -10^9 −109 <= target <= 1 0 9 10^9 109
题解1 对角线上下循环搜索(超时)
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
const int row = matrix.size();
const int column = matrix[0].size();
int km = min(row, column);
if(1 == row){
for(int i = 0; i < column; i++){
if(target == matrix[0][i])
return 1;
else if(! i && target < matrix[0][i])
return 0;
}
}else if(1 == column){
for(int i = 0; i < row; i++){
if(target == matrix[i][0])
return 1;
else if(! i && target < matrix[i][0])
return 0;
}
}else{
for(int i = 0; i < km; i++){
if(target == matrix[i][i])
return 1;
else if(target < matrix[i][i]){
if(! i) return 0;
else{
// 剪枝失败
// 搜索空间只有 matrix[<i][<j]
// 行
for(int k = 0; k < i; k++)
for(int l = 0; l < column; l++)
if(target == matrix[k][l])
return 1;
// 列
for(int k = 0; k < i; k++)
for(int l = 0; l < row; l++)
if(target == matrix[l][k])
return 1;
}
}
}
}
return 0;
}
};
生气!!无脑循环都不超时
// 整理思路
// 应该从第一行最大值开始比较,不要纠结在对角线上
// 根据数据特点剪枝(缩小搜索空间)
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
const int row = matrix.size();
const int column = matrix[0].size();
int i(0), j(column-1);
while(i < row && j >= 0){
if(target == matrix[i][j])
return 1;
else if(target > matrix[i][j])
i ++;
else j --;
}
return 0;
}
};
题解2 无脑循环
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
for (const auto& row: matrix) {
for (int element: row) {
if (element == target) {
return true;
}
}
}
return false;
}
};
题解3 学习STL(二分查找)
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
for (const auto& row: matrix) {
// 二分查找
auto it = lower_bound(row.begin(), row.end(), target);
if (it != row.end() && *it == target) {
return true;
}
}
return false;
}
};