《剑指Offer》题目——二维数组中的查找

Posted VictorWei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指Offer》题目——二维数组中的查找相关的知识,希望对你有一定的参考价值。

题目描述:

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

题目分析:

 暴力破解时间复杂度太高,本题有两种思路:
1. 将每行看成一个有序数组,用二分查找
2. 从左下角开始查找,若大于该值,右移;若小于该值,上移,直到找到为止

public class ArraySearch {

    public static boolean Find(int target, int [][] array) {
        int len1 = array.length;
        int len2 = array[0].length;

        for (int i = 0; i<len1 ; i++)
            for (int j=0; j<len2; j++){
            if (target == array[i][j]) return true;
            }
        return false;
    }

    public static boolean Find1(int target, int[][] array){
        int len1 = array.length;
        int len2 = array[0].length;
        int temp = 0;
        //从左下角开始查找
        int row = len1 - 1 ;
        int col = 0 ;
        while (row >=0 && col <= len2-1){
            temp = array[row][col];
            if (target == temp) return true;
            if (target < temp) {
                row --;
            }
            if (target > temp) {
                col ++;
            }
        }
        return false;
    }

    public static boolean binarySearch(int target,int [] num){
        int len = num.length;
        int left = 0;
        int right = len - 1;

        while (left <= right){
            int mid = (right-left)/2 + left;
            if (target == num[mid]) return true;
            if (target > num[mid]){
                left = mid+1;
            }
            if (target < num[mid]){
                right = mid -1 ;
            }
        }
        return false;
    }


    public static boolean Find2(int target, int[][] array){
        //二分查找
        int len1 = array.length;
        int len2 = array[0].length;
        for (int i=0; i< len1; ++i ){
            if (binarySearch(target,array[i])) return true;
        }
        return false;
    }

    public static void main(String[] args){
        int[][] array = new int[4][3];
        array[0][0] = 1;array[0][1] = 2;array[0][2] = 3;
        array[1][0] = 4;array[1][1] = 5;array[1][2] = 6;
        array[2][0] = 7;array[2][1] = 8;array[2][2] = 9;
        array[3][0] = 10;array[3][1] = 11;array[3][2] = 12;
        int target = 5;
        System.out.println(Find2(12,array));

    }
}

 

以上是关于《剑指Offer》题目——二维数组中的查找的主要内容,如果未能解决你的问题,请参考以下文章

[剑指Offer]5.二维数组中的查找

《剑指Offer》题目——二维数组中的查找

剑指Offer学习面试题:二维数组中的查找PHP实现

剑指offer题解二维数组中的查找

Java 剑指offer 二维数组中的查找

剑指Offer——二维数组中的查找