01.在一个二维数组中,每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
例如下面二位数组就是每行、每列都递增排序。如果在这个数组中查找数字为7,则返回true;如果查找数字5,由于数组中不含有该数字,则返回false;
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
首先我们选取数组右上角的数字9。由于9大于7,并且9还是第4列的第一个(也是最大小的)数字,因此7不可能出现在数字9所在的列。于是我们把这一列从需要考虑的区域内提出,之后只需要分析剩下的3列。在剩下的矩阵中,位于忧伤角度的数字8.同样8大于7,因此8所在的列我们也可以剔除。接下来我们只要分析剩下的两列即可。
在剩余的两列组成的数组中,数字2位于数组的右上角。2小于7,那么要查找的7只有可能在2的右边,也有可能在2的下边。在前面的步骤中,我们已经发现2右边的列都已经被提出了,也就是说7不可能出现在2的右边,因此7只有可能出现在2的下边。于是我们把数字2所在的行业剔除,只分析剩下的3行2列数字。在剩下的数字中,数字4位于右上角,和前面一样,我们把数字4所在的行业删除,最后剩下两行两列数字。
在剩下的两行两列4个数字中,位于右上角的刚好就是我们要查找的数字7,于是查找过程就可以结束了。
如图所示:
java代码:
import java.util.Scanner;
public class ArrayFind {
/**
* 在一个二维数组中,每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序。请完成一个函数,
* 输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
*/
public static boolean find(int[][] arr, int rows, int columns, int number) {
boolean flag = false;// 默认标记
int row = 0;// 设置行
int column = columns - 1;// 设置列
if (arr != null && rows >= 0 && columns > 0) {
while (row < rows && column>=0) {
if (number == arr[row][column]) { //比较右上角的值,相等找到!
flag = true;
break;
} else if (number < arr[row][column]) { //如果number比右上角的小,干掉一列
column--;
} else if (number > arr[row][column]) { //如果number比右上角的大,干掉一行
row++;
} else {
break;
}
}
}
if (flag == false) {
System.out.println("抱歉没有找到!");
} else {
System.out.println("找到了!位置为:[" + row + "][" + column + "]");
}
return flag;
}
public static void main(String[] args) {
int[][] arr = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 },
{ 6, 8, 11, 15 } };
// 打印数组
for (int x = 0; x < arr.length; x++) {
for (int y = 0; y < arr[x].length; y++) {
System.out.print(arr[x][y] + " ");
}
System.out.println();
}
System.out.println("请输入要查找的数字:");
Scanner sc = new Scanner(System.in);
int in = sc.nextInt();
find(arr, 4, 4, in);
}
}
——《剑指offer》笔记,仅供自己日后复习查看