题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
初步解题思路:一开始总想着数组有顺序,所以此题有捷径,但却越想越绕。想一开始就确定出target在数组中的左下边界,所以使用了两个for循环来确定。for循环有一个缺点,无法判断出数组是否为空数组,所以要在开始时先判断。思路太复杂,不精简,代码冗余度高。
最优解:使用while循环,不需要额外判定空数组,过程与走迷宫相似。从数组左下角开始,target比当前数大就右移,比当前数小就上移。
Java初步解题
public class Solution {
public boolean Find(int target, int [][] array) {
int i,j;
int endx=0, endy=0,a=0;
if((array==null||array.length==0)||(array.length==1&&array[0].length==0))
return false;
int x = array.length;
int y = array[1].length;
if(target < array[0][0] || target> array[x-1][y-1])
return false;
for(i=0;i<y;i++) {
if (target <= array[x - 1][i]) {
endy = i;
break;
}
}
for(j = x-1;j>=0;j--){
if(target <= array[j][endy])
if(target == array[j][endy])
return true;
else {
if(j==0)
return false;
else{
endx = j - 1;
break;
}
}
}
a = endy;
for(i = endx; i>=0;i--){
for(j = endy;j<y;j++){
if(target == array[i][j])
return true;
if(target < array[i][j])
break;
if(target > array[i][j]){
a += 1;
if(a>=y)
return false;
}
}
endy = a;
if(i!=0 && target > array[i-1][y-1])
return false;
}
return false;
}
}
最优解:
public boolean Find(int target, int [][] array) {
int rows = array.length;
int cols = array[0].length;
int i=rows-1,j=0;
while(i>=0 && j<cols){
if(target<array[i][j])
i--;
else if(target>array[i][j])
j++;
else
return true;
}
return false;
}