剑指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;
    }
}    
原文地址:https://www.cnblogs.com/meteorst/p/9220495.html