题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
思路:两个for循环暴力破解。。。时间复杂度O(n*m),,太没水平了(逃~ε=ε=ε=┏(゜ロ゜;)┛
因为数组是有序的,所以可以分情况讨论,从右上角开始,
当选取的数字等于要查找的数时,结束查找。
当选取的数字大于要查找的数字时,剔除选取数字的这一列,即 col - 1。
当选取的数字小于要查找的数字时,剔除选取数字的这一行,即 row -1。
所以时间复杂度O(m+n)
代码如下:
package forl.girl.offer;
import java.util.Scanner;
public class fourSearchTwoarr {
public static void main(String[] args) {
int [][]arr = new int [9][9];
int increase=1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr[i][j]=increase;
increase++;
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
Scanner in = new Scanner(System.in);
int row = 0;
int column = arr[0].length-1;
int find=0;
System.out.println("输入要查找的数字");
int target = in.nextInt();
while (row < arr.length && column >= 0) {
if(arr[row][column] == target) {
System.out.println("找到啦");
find=1;
break;
}
if(arr[row][column] > target) {
column--;
} else {
row++;
}
}
if(find!=1) System.out.println("找不到");
}
}
总结:有序二维数组的查询可以使用以上方法。但是不能选取左上或者右下,因为查找的数一定大于等于最小的数,小于等于最大的数,这样就不能排除当前行或者当前列。