二维数组中的查找
题目
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思想
判断右上角的数字,如果比右上角的数字小,则舍弃右上角的一列。
如果比右上角的数字大,则判断右上角所在一列。
(代码1:case通过率为58.82%。)
public static boolean find(int target, int [][] array) {
int lenX = array.length;
int lenY = array[0].length;
System.out.println("lenX:"+lenX);
System.out.println("lenY:"+lenY);
int i = 0;
for (int j = lenY - 1; j >= 0; j--) {
if (target == array[i][j]){
return true;
}else if (target < array[i][j]){
continue;
}else{
for (int k = i; k < lenX ; k++) {
if (target == array[k][j])
return true;
}
return false;
}
}
return false;
}
(错误在于:没有考虑到左边列。改正如下,通过。)
(但是,仍有应当改进的地方:行值。应当改为考虑左下角,而不是左边两列。)
public static boolean find(int target, int [][] array) {
int lenX = array.length;
int lenY = array[0].length;
System.out.println("lenX:"+lenX);
System.out.println("lenY:"+lenY);
int i = 0;
for (int j = lenY - 1; j >= 0; j--) {
if (target == array[i][j]){
return true;
}else if (target < array[i][j]){
continue;
}else{
for (int k = i; k < lenX ; k++) {
if (target == array[k][j])
return true;
if (k == lenX - 1 && j == 0){
return false;
}
}
i = 0;
}
}
return false;
}
}
(代码2:考虑到行值问题,保留左下角)
public static boolean findOffer(int target, int [][] array) {
boolean found = false;
int rows = array.length;
int columns = array[0].length;
if (array != null && rows > 0 && columns > 0){
int row = 0;
int column = columns-1;
while(row < rows && column >= 0){
if (array[row][column] == target){
found = true;
break;
}else if (array[row][column] > target){
column--;
}else
row++;
}
}
return found;
}