题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:
1.效率最低–一个一个查
时间复杂度O(n的平方),空间复杂度O(1)
public class Solution {
public boolean Find(int x,int numbers[][]){
if(numbers==null||numbers.length<=0){
return false;
}
for(int i=0;i<numbers.length-1;i++){
for(int j=0;j<numbers[i].length-1;j++){
if(numbers[i][j]>numbers[i+1][j]){
return false;
}
if(numbers[i][j]>numbers[i][j+1]){
return false;
}
}
}
for(int m=0;m<numbers.length;m++){
for(int n=0;n<numbers[m].length;n++){
if(numbers[m][n]==x){
return true;
}
}
}
return false;
}
}
2.利用二维数组由上到下,由左到右递增的规律,那么选取左下角或者右上角的元素a[i][j]与target进行比较,若两者相等,查找结束;如果a[i][j]<target则target必定在元素a所在行的右边,即j++;当target小于元素a[i][j]时,那么target必定在元素a所在列的上边,即i–;时间复杂度O(m+n)
2.1每次都选择数组查找范围内的最右上角的数字
public boolean Find(int x,int numbers[][]){
if(numbers==null||numbers.length<=0){
return false;
}
for(int i=0;i<numbers.length-1;i++){
for(int j=0;j<numbers[i].length-1;j++){
if(numbers[i][j]>numbers[i+1][j]){
return false;
}
if(numbers[i][j]>numbers[i][j+1]){
return false;
}
}
}
int m=numbers[0].length-1;//列
int n=0; //行
while(m>=0&&n<=numbers.length-1){
if(numbers[n][m]>x){
m--;
}else if(numbers[n][m]<x){
n++;
}else{
return true;
}
}
return false;
}
2.2每次都选择数组查找范围内的最左下角的数字
public boolean Find(int x,int numbers[][]){
if(numbers==null||numbers.length<=0){
return false;
}
for(int i=0;i<numbers.length-1;i++){
for(int j=0;j<numbers[i].length-1;j++){
if(numbers[i][j]>numbers[i+1][j]){
return false;
}
if(numbers[i][j]>numbers[i][j+1]){
return false;
}
}
}
int m=numbers.length-1;//行
int n=0; //列
while(m>=0&&n<=numbers[0].length-1){
if(numbers[m][n]>x){
m--;
}else if(numbers[m][n]<x){
n++;
}else{
return true;
}
}
return false;
}