- 题目描述:
-
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。
输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。
接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
- 输出:
-
对应每个测试案例,
输出”Yes”代表在二维数组中找到了数字t。
输出”No”代表在二维数组中没有找到数字t。
- 样例输入:
-
3 3 5 1 2 3 4 5 6 7 8 9 3 3 1 2 3 4 5 6 7 8 9 10 3 3 12 2 3 4 5 6 7 8 9 10
- 样例输出:
-
Yes No No
分析:
选取最左下角的数字与要查找的数字比较,如果左下角的数字大于查找的数字,则表示最下面的一行都是大于要查找的数字的,所以可以将最下面一行去掉==》row--,相反如果左下角的数字小于查找的数字,那么第一列的数字都会被要查找的数字小,所以可以将第一列的数字去掉==》column++,直到找到要查找的数字,或者row<0或者column>columns。只能从左下角或者右上角开始,因为如果选择左上角,并不能够判断出是row--,还是column++。
代码:
package off002; /** * @Title: Main.java * @Package: off002 * @Description 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序, * 每一列都按照从上到下递增的顺序排序。请完成一个函数, * 输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 * @author Han * @date 2016-4-13 下午5:17:34 * @version V1.0 */ public class Main { public static void main(String[] args) { //for a example //rows = 3,column = 3,number = 2 //arr 1 2 3 // 4 5 6 // 7 8 9 //return true int[] arr = {3,3,0,1,2,3,4,5,6,7,8,9}; int rows = arr[0]; int columns = arr[1]; int number = arr[2]; if(find(arr, rows, columns, number)){ System.out.println(true); }else{ System.out.println(false); } } private static boolean find(int arr[], int rows, int columns, int number) { //find the lower left quarter first int row = rows - 1; int column = 0; //row < 0 and column = columns over the while and return false while(row >= 0 && column < columns){ //find the number if(arr[row * columns + column] == number){ return true; }else if(arr[row * columns + column] < number){ column++; }else{ row--; } } return false; } }