剑指Offer--我用JAVA做(二)

来源:互联网 发布:银行数据标准定义规范 编辑:程序博客网 时间:2024/06/03 17:54
/** * 题目描述:    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 *输入:    输入可能包含多个测试样例,对于每个测试案例,    输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。    输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。    接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。*输出:    对应每个测试案例,    输出”Yes”代表在二维数组中找到了数字t。    输出”No”代表在二维数组中没有找到数字t。 * * @author zonebase@163.com */public class day02 {public static void main(String[] args) {int array[][] = { { 2,3,4 }, { 5,6,7 }, { 8,9,10 } };System.out.println(solution(array,6));System.out.println(solution(array,12));}/** *采用二分查找法,时间复杂度为O(max(m,n))。先将给定的值key与二维数组右上角的元素比较, *若相等,则返回true,若key小于它,则最后一列的元素肯定都大于key,此时可以删除掉最后一列, *而若key大于它,则第一行的元素肯定都小于key,此时可以删除掉第一行,依次向下比较,如果比较到了左下角的元素,还没有发现等于key的,则返回fasle。 *当然也可以从左下角开始找 */private static boolean solution(int[][] array,int key){if(array==null||array.length<1||array[0].length<1){return false;}int original_rows=array.length;int original_columns=array[0].length;int current_row = 0;          int current_column = original_columns - 1;          while (current_row < original_rows && current_column >= 0) {              if (array[current_row][current_column] == key) {                  return true;             } else if (array[current_row][current_column] > key) {                  // 列变小              current_column--;              } else {                  // 行变大              current_row++;              }          }  return false;}}

0 0
原创粉丝点击