剑指Offer03-二维数组中的查找
题目:
/**
* 在一个二维数组中,每一行都按照从左到右递增
* 的顺序排序,每一列都按照从上到下递增的顺序排序。
* 请完成一个函数,输入这样的一个二维数组
* 和一个整数,判断数组中是否函数该整数。
*/
解题思路:
查找的本质就是先指定一个初始值,把初始值与要查找的数进行比较,如果两个数相等,就返回true,否则初始值发生变化,继续与要查找的值进行比较,直到找到或找不到;
在本题中的二维数组中,数字的排序遵循从左向右增加,从上往下增加的规律,问题的关键在于如何选取适当的初始值,来简化查找的过程;
简化查找的过程在于如何缩小数组中的范围,左上角和右下角分别对应数组中的最小值和最大值,如果以两者中的其中之一为初始值的话,初始值都能够朝着两个方向发生变化
无法缩小查找的范围(比如:以左上角的值为初始值,如果要查找的值比初始值大,那么下一个初始值的选取是在第一行或者第一列,没法做到缩小查找范围的作用。右下角同理)
若选取右上角和左下角的值为初始值,比如右上角的值为初始值,若要查找的值小于初始值,则可以排除右上角所在的列,若要查找的值大于初始值,则可以排除右上角所在的行。
以此类推,直到找到要查找的值或找不到返回false,左下角的值同理。
代码如下:
public class ArraySerach { public static void main(String[] args) { int[][] arr = { {1,2,8,9}, {2,4,9,12}, {4,7,10,13}, {6,8,11,15}}; System.out.println(search(arr,7)); } private static boolean search(int[][] arr,int value) { int a = arr[0].length; int b = arr.length; int i = 0; int j = a-1; while(i<=b-1 && j>=0) { if(arr[i][j] == value) { return true; } if(arr[i][j] > value) { j--; }else { i++; } } return false; } }