有序二维数组寻找目标数字

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

二维数组 如下所示:

1  2  3

4  5  6

7  8  9


解题思路

第一种:暴力求解法

遍历每一行直到找到目标数字

public class Solution {

    public boolean Find(int target, int [][] array) {

        //外层遍历纵坐标

        for(int i = 0;i <= array.length-1;i++){

            //内层遍历横坐标

            for(int j = 0;j <= array[0].length-1;j++){

                //寻找目标数字

                if(target == array[i][j]){

                    return true;

                }

                continue;

            }

        }

        return false;

    }

}


第二种:左下右上法(左下法)

因为该二维数组是有序排列的,因此每行的开头和结尾是该行最小或最大的值,用目标数字和最后一行的开头进行比较,如果目标数字比其大,那么继续横向比较,如果比其小,则减少行数比较下一行的开头值

public class Solution {

    public boolean Find(int target, int [][] array) {

        //左下法

        int rowCount = array.length;

        int colCount = array[0].length;

        int i = rowCount - 1;

        int j = 0;

        //确保不会跑出边界,所以用&&运算

        while(i >= 0 && j <= colCount - 1){

            if(target > array[i][j]){

                j++;

                continue;

            }else if(target < array[i][j]){

                i--;

                continue;

            }else{

                return true;

            }

        }

        return false;

    }

}


总结:第二种方式显然比暴力法会遍历更少的数据量,理论来说应该效率更高,但是如上图测试结果来分析,造成这种情况的可能性如下:1.二维数组数据量大小 2.目标数字在二维数组的位置 3.定义变量的数量


知识点:

二维数组获取边界的写法

int rowCount = array.length;    //获取纵坐标边界长度

int colCount = array[0].length;    //获取横坐标边界长度

控制边界,循环确定边界时要小心,二维数组必须满足横纵都在边界内才行

while(i >= 0 && j <= colCount - 1)   //&& 同时为true || 任一为true

你可能感兴趣的:(算法)