Leetcode offer系刷题 || 二维数组中的查找☆
题目:n*m的二维数组中查找一个数字。2 <= n <= 100000
方法一:分块查找
方法二:二叉搜索树
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int row = matrix.length;
if(row == 0)
return false;
int col = matrix[0].length;
if(col == 0)
return false;
for(int i = 0, j=col-1 ;i<row&&j>=0; )
{
if(target == matrix[i][j])
return true;
else if(target > matrix[i][j])
{
i+=1;
}
else if(target < matrix[i][j])
{
j-=1;
}
}
return false;
}
}
方法二:分块查找
分块递归,耗时省空间
class Solution {
public boolean sub(int[][]matrix, int target,int a, int b, int n, int m){
System.out.println(a+" "+b+" "+n+" "+m+" ");
if(matrix[n-1][m-1] < target){
return false;
}
if(n-a==0 || m-b==0){
return false;
}
if(n-a==1){
for(int i=b;i<m;i++){
if(matrix[a][i]>target){
return false;
}
else if(matrix[a][i]==target){
return true;
}
}
return false;
}
if(m-b==1){
for(int i=a;i<n;i++){
if(matrix[i][b]>target){
return false;
}
else if(matrix[i][b]==target){
return true;
}
}
return false;
}
int i = n-1, j=m-1;
while(i>=a && j>=b){
if(matrix[i][j]== target){
return true;
}
else if(matrix[i][j]>target && i>a && j>b){
i--;
j--;
continue;
}else if(matrix[i][j]>target){
if(i==a&&j==b)
return false;
if(i==a)
return sub(matrix,target,a,b,n,j);
if(j==b)
return sub(matrix,target,a,b,i,m);
}
else{
if(i==n-1&&j==m-1){
return false;
}
return sub(matrix,target,a,j+1,i+1,m)||sub(matrix,target,i+1,b,n,j+1);
}
}
return false;
}
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int n = matrix.length;
int m = 0;
if(n > 0){
m = matrix[0].length;
}
if(n==0||m==0){
return false;
}
System.out.println(n);
return sub(matrix,target,0,0,n,m);
}
}