二维数组中的查找

题目描述

给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。


Consider the following matrix:
[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

Given target = 5, return true.
Given target = 20, return false.

解题思路

要求时间复杂度 O(M + N),空间复杂度 O(1)。其中 M 为行数,N 为 列数。

该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间,当前元素的查找区间为左下角的所有元素。

我的代码

package arithmetic.mydatabase.day01.arithmetic04;

/*
        给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。
        给定一个数,判断这个数是否在该二维数组中。

                Consider the following matrix:
                [
                [1,   4,  7, 11, 15],
                [2,   5,  8, 12, 19],
                [3,   6,  9, 16, 22],
                [10, 13, 14, 17, 24],
                [18, 21, 23, 26, 30]
                ]

                Given target = 5, return true.
                Given target = 20, return false.

                要求时间复杂度 O(M + N),空间复杂度 O(1)。其中 M 为行数,N 为 列数。

                该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边。
                因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间,当前元素的查找区间为左下角的所有元素。
*/

public class Test {
    public static void main(String[] args) {
        int a[][] = {
                {1,  4,  7,  11, 15},
                {2,  5,  8,  12, 19},
                {3,  6,  9,  16, 22},
                {10, 13, 14, 17, 24},
                {18, 21, 23, 26, 30}
                };

        for (int[] x :a){
            for (int y:x){
                System.out.print(y+" ");
            }
            System.out.println();
        }

        int i=5;

        Test test = new Test();
        boolean find = test.Find(i, a);
        System.out.println(find);

    }

    public boolean Find(int target,int [][] matrix){
        if (matrix==null || matrix.length ==0|| matrix[0].length==0)//可行性判断
            return false;

        int rows = matrix.length;//行
        int cols = matrix[0].length; //列

//        我们从右上角开始
        int r=0,c=cols-1;

        while ( r<=cols-1 && c>=0 ){//可行性判断

            if (target == matrix[r][c])
                return true;
            else if (target > matrix[r][c])
                r++;
            else
                c--;
        }
        return false;
    }

}

我的做题思路
如解题思路
数据从左至右增大,从上到下增大,如果我们需要找到一个数是否是在该数组中,我们就需要与右上角的数据比较,如果比该数大,我们的行下标+1否则列下标-1,以此类推如果有冲突(即是移动比较的数组后发现下标回退为上一个数据,说明数组中没有我们需要的数据)

进数据后我们先进行可行性判断

    if (matrix==null || matrix.length ==0|| matrix[0].length==0)//可行性判断 验证该数组是否真实存在

然后我们进行标注,标注该二维数组的行和列

int rows = matrix.length;//行
int cols = matrix[0].length;//列

此时,我们从右上角开始
即是

    int r=0,c=cols-1;

然后我们进行可行性判断(防止数组下标越界)

    while ( r<=cols-1 && c>=0 ){//可行性判断

如果 我们设定的值和数组中当前的值相同
我们返回true

        if (target == matrix[r][c])
            return true;

如果我们设定的值比数组当前的值大
此时行数+1 继续循环

        else if (target > matrix[r][c])
            r++;

如果我们设定的值比数组当前的值小
此时列数-1 继续循环

        else
            c--;

如果都没有找到则返回为false

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容