矩阵四分:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
tar=target;
return find(matrix,0,matrix.size()-1,0,matrix[0].size()-1);
}
private:
bool find(vector<vector<int>>& matrix,int row_left,int row_right,int col_top,int col_bottom){
if(row_left>row_right||col_top>col_bottom||col_bottom>=matrix[0].size()||row_right>=matrix.size()) return false;
if(row_left==row_right&&col_top==col_bottom&&tar!=matrix[row_left][col_bottom]) return false;
int mid_row=(row_left+row_right)>>1;
int mid_col=(col_top+col_bottom)>>1;
if(tar==matrix[mid_row][mid_col]) return true;
if(tar>matrix[mid_row][mid_col])
return find(matrix,mid_row+1,row_right,col_top,mid_col)||
find(matrix,row_left,mid_row,mid_col+1,col_bottom)||
find(matrix,mid_row+1,row_right,mid_col+1,col_bottom);
else return find(matrix,row_left,mid_row,col_top,mid_col)||
find(matrix,mid_row+1,row_right,col_top,mid_col)||
find(matrix,row_left,mid_row,mid_col+1,col_bottom);
}
private:
int tar;
};
Z字形查找:
Krahets - 力扣(LeetCode):
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m=0,n=matrix[0].size()-1;
while(m<matrix.size()&&n>=0&&matrix[m][n]!=target){
if(matrix[m][n]>target) --n;
else ++m;
}
cout<<m<<' '<<n;
if(m<matrix.size()&&n>=0) return true;
return false;
}
};
暴力解法:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
for(int i=0;i<matrix.size();++i)
for(int &num:matrix[i])
if(num==target) return true;
return false;
}
};