第一题、杨氏矩阵查找

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    例如下面的二维数组就是每行、每列都递增排序,如果在这个数组中查找数字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;    }  }