LeetCode题解:剑指offer04-二维数组中的查找

题目地址:

https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/

题目描述:

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

示例:

LeetCode题解:剑指offer04-二维数组中的查找_第1张图片

数据范围:

题解思路:

思路一:

暴力题解,遍历矩阵,肯定能找到,代码如下:

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if (matrix == null || matrix.length==0 || matrix[0].length==0 ) {
            return false;
        }
        int lineNumber = matrix.length, columnNumber = matrix[0].length;

        for (int i = 0; i < lineNumber; i++) {
            for (int j = 0; j < columnNumber; j++) {
                if (target == matrix[i][j]){
                    return true;
                }
            }
        }
        return false;
    }
}

思路二,矩阵中的数据排列是有特定规律的,这样就提示我么使用规律进行解题。

首先想到的应该是从左上角开始,选择一个方向进行深度优先遍历,下一个数字小于当前数则继续,否则就更改方向。这种方法在发生回溯时会比较难判断如何选择方向,例如,还是示例中的矩阵,我们按照左上角开始,优先向右走,一直走到边界15,然后更改方向但是下面的数字是19,此时无法再向下走,而且按照原先设定的规则,程序此时是完全懵逼的,它不知道下一步往拿走,于是搜索的结果是不存在17。

上面那种方法的问题在于,从左上角开始,那么某位置的数字的右边和下面都是比它大的数字,无法确切的确定一个方向,靠的是人为的指定遍历顺序。仔细观察会发现,这个图具有二叉搜索数的特点:从右上角开始,左边的数字都小于当前数字,而下边数字都大于当前数字,此时,如何选择路线便不再依赖于人的瞎指定,而是有规则可依据的,使用深度优先遍历即可。代码如下:

public class SearchInMatrix2 {

    public boolean findNumberIn2DArray(int[][] matrix, int target) {

        if (matrix == null || matrix.length==0 || matrix[0].length==0 ) {
            return false;
        }

        if (dfs(matrix, 0, matrix[0].length-1, target)){
            return true;
        }else{
            return false;
        }
    }

    private boolean dfs(int[][] matrix, int i, int j, int target ){

        if (i> matrix.length-1 || j<0){
            return false;
        }

        if (matrix[i][j] == target){
            return true;
        }else if (matrix[i][j] > target){
            return dfs(matrix, i, j-1, target);
        }else{
            return dfs(matrix, i+1, j, target);
        }
    }
}

 

 

 

 

 

 

 

你可能感兴趣的:(编程算法,深度优先遍历,leetcode,java,算法)