第一题、杨氏矩阵查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序,如果在这个数组中查找数字6,则返回True;如果查找数字10,由于数组不含有该数字,则返回False。
1 2 3
4 5 6
7 8 9
输入:
输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。
输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。
接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如上描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
输出:
对应每个测试案例,
输出”True”代表在二维数组中找到了数字t。
输出”False”代表在二维数组中没有找到数字t。
输入样例:
3 3
1
2 3 4
5 6 7
8 9 10
输出样例:
False
在线提交代码地址:http://hero.pongo.cn/Question/Details?ID=18&ExamID=18。
根据参与者提交代码的优劣,选出一名胜出者,特奖励最新程序员杂志一本,本人颁奖,为期30天,2013-04-19截止,欢迎大家尽情享受在线编程与思考的乐趣,感谢。
July、二零一二年三月二十日。
-----------------------------------------
下面是我写的代码:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Test { /** * @param args * @throws IOException * @throws NumberFormatException */ public static void main(String[] args) throws NumberFormatException, IOException { int r = 0 ; int c = 0 ; int number = 0; System.out.print("请输入二维数组的行数:"); BufferedReader strin=new BufferedReader(new InputStreamReader(System.in)); r=Integer.parseInt(strin.readLine()); System.out.print("请输入二维数组的列数:"); strin=new BufferedReader(new InputStreamReader(System.in)); c=Integer.parseInt(strin.readLine()); int [][] a = getArray(r,c); for (int i = 0; i < a.length; i++) { int [] b = a[i]; for (int j = 0; j < b.length; j++) { System.out.print(b[j] + " "); } System.out.println(); } System.out.print("请输入要查找的数:"); strin=new BufferedReader(new InputStreamReader(System.in)); number = Integer.parseInt(strin.readLine()); System.out.println(exists(a,number)); System.out.println(); } /** * 生成二维数组并行,列递增排序 * @param r 行数 * @param c 列数 * @return */ public static int[][] getArray(int r,int c){ int[][] arr = new int[r][c]; int k = 0; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { arr[i][j] = c+k; k++; } } return arr; } /** * 判断数字是否存在二维数组中 * @param arr 二维数组 * @param number 是否存在的数值 * @return */ public static boolean exists(int[][] arr,int number){ for (int[] is : arr) { if(search(is, number)){ return true; } } return false; } /** * 二分查找算法 * @param array 有序数组 * @param number 查找元素 * @return */ public static boolean search(int[] array, int number){ int low = 0; int high = array.length-1; while(low <= high) { int middle = (low + high)/2; if(number == array[middle]) { return true; }else if(number <array[middle]) { high = middle - 1; }else { low = middle + 1; } } return false; } }