JS Bin

剑指Offer(数组)-二维数组的查找

  (二位数组的查找)题目描述:

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

  解决办法一:利用二分查找的方法

  利用 while ( low <= high) 来实现遍历查找,和目标值进行比较,若目标值在左边就 high = mid -1 ,若目标值在右边就 low = mid + 1。

public class Solution {
    public boolean Find(int target, int [][] array) {
        //利用二分查找的方法,时间复杂度是nlogn
        for(int i=0; i<array.length; i++){
            int low =0;
            int high =array[i].length - 1;
            while(low <= high){
                int mid = (low + high)/2;
                if(array[i][mid] > target){
                    high = mid -1;
                }else if(array[i][mid] < target){
                    low = mid + 1;
                }else{
                    return true;
                }
            }
        }
        return false;
    }
}

  解决办法二:利用自身数组的特性,自上而下和自左向右是递增的,

  利用左下角的元素进行与目标值的比较,若目标值比它大说明在左下角元素所在列的右边,若目标值比它小则说明在左下角元素所在行的上一行,这样子能比较到和目标值相同的元素。

public class Solution {
    public boolean Find(int target, int [][] array) {
        int rows = array.length;
        if(rows == 0){
            return false;
        }
        int cols = array[0].length;
        if(cols == 0){
            return false;
        }
        int row = rows-1;
        int col = 0;
        while(row >= 0 && col < cols){//如果此处是<=会导致数组越界异常
            if(array[row][col] < target){
                col++;
            }else if(array[row][col] > target ){
                row--;
            }else{
                return true;
            }
        }
        return false;
    }
}

  需要注意的是 col < cols , 这一点是必须的,因为若条件里面判断通过,但是在逻辑里面多了col ++ 的话,就会导致数组越界异常。

posted @ 2020-03-18 16:53  左五六  阅读(138)  评论(0编辑  收藏  举报