剑指offer 二维数组中的查找

题目:

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

思路:矩阵是有序的,左下,向右依次递增,[m][n]

        1. 可以从右上角开始找,只要小于,那么这一列都不满足,复杂度O(m + n)。

        2. 每一行都是递增的,那么显然可以用二分查找,(优化:只要target< arr[i][mid],那么以后就不用考虑mid以后的列)
            复杂度O(mlgn) ,当m << n ,二分比较好。

class Solution {

    public boolean Find(int target, int [][] array) {
        int row = 0;
        int col = array[0].length;
        while(row <= array.length-1 && col >= 0){
            if(target == array[row][col]){
                return true;
            }else if(target > array[row][col]){
                row++;
            }else{
                col--;
            }
        }
        return false;
    }

    public boolean Find(int target, int [][] array) {
        int row = 0;
        int col = array[0].length - 1;
        for(; row <= array.length - 1 && col >= 0; ){
            if(target == array[row][col]){
                return true;
            }else if(target > array[row][col]){
                row ++;
            }else {
                col --;
            }
        }
        return false;
    }
  
    public boolean Find(int target, int [][] array){

        for(int i = 0; i < array.length; i ++){
            int low = 0;
            int high = array[i].length - 1;
            while(low <= high){
                int mid = low + (high - low)/2;
                if(target > array[i][mid]){
                    low = mid + 1;
                }else if(target < array[i][mid]){
                    high = mid - 1;
                }else {
                    return true;
                }
            }
        }
        return false;
    }

}

本题注意点:

  • 不要每次一循环都用for循环,这里行,列满足一定条件都可以了。
  • 二维数组的arr行列长度,行 arr.length   列 arr[0].length。
  • 二分查找不是很熟练写出来


猜你喜欢

转载自blog.csdn.net/jae_wang/article/details/80301439