题目描述(书中第三题)
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
public class Solution {
public boolean Find(int target, int [][] array) {
if (array == null || array.length == 0 || (array.length == 1 && array[0].length == 0))
return false;
int a = array.length;
int b = array[0].length;
for(int i = 0; i<a; i++){
if(target>=array[i][0]){ //只要target不小于某行数组的第一个值,即开始进入for循环查找
for(int j = 0; j<b; j++){
if(target==array[i][j])
return true;
}
}
}
return false;
}
}
自己的思路有两个注意的地方:
- 二维数组行数和列数的计算
- 二维数组为空的判断。null和空数组是不一样的。有一个测试用例“16,[[]]”,有行,但列数为0
其实这种思路,相当于直接遍历了,代码还没有直接遍历来的简单。。。但复杂度和直接遍历基本一样
====
利用数组的特点,从左下角或者右上角开始查找,可以快速缩小范围
public class Solution {
public boolean Find(int [][] array,int target) {
int m = array.length - 1;
int i = 0;
while(m >= 0 && i < array[0].length){
if(array[m][i] > target)
m--;
else if(array[m][i] < target)
i++;
else
return true;
}
return false;
}
}
要自己处理输入的版本:
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Integer N = sc.nextInt();
Integer M = sc.nextInt();
Integer K = sc.nextInt();
Integer[][] arr = new Integer[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j< M; j++) {
arr[i][j] = sc.nextInt();
}
}
int m = arr.length - 1;
int n = 0;
boolean flag = false;
for(;m>=0 && n<=arr[0].length - 1;){
if(arr[m][n] > K){
m--;
}
else if(arr[m][n] < K){
n++;
}
else {
flag = true;
break;
}
}
if (flag) {
System.out.print("Yes");
} else {
System.out.print("No");
}
}