LeetCode 面试题4 二维数组中的查找

LeetCode 面试题4 二维数组中的查找

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

递归

  • 矩阵反对角线 (右上到左下) 上的元素将矩阵中的所有元素分为两半 (左上小于、右下大于)
  • 从反对角线上任一元素出发,搜索目标元素 target
  • 若 target 大于当前元素,则下一步向下、右方向搜索
  • 若 target 小于当前元素,则下一步向上、左方向搜索
  • 最后若 target 等于当前元素,则返回 true
  • 整个过程采用递归实现

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:43.9 MB, 在所有 Java 提交中击败了96.10%的用户

class Solution {
    public boolean findNumberIn2DArray(int[][] array, int target) {
        if(array==null || array.length==0 || array[0].length==0) {
            return false;
        }
        
        int rows = array.length, cols = array[0].length;
        return rec(array, new int[]{0, cols-1}, target, new boolean[rows][cols]);
    }

    public boolean rec(int[][] array, int[] curr, int target, boolean[][] visited) {
        //target与array[curr[0]][curr[1]]比较
        //大于则向右、向下;小于则向左、向上;等于则返回True
        //若两个方向均已访问,则返回False
        if(curr[0]<0 || curr[0]>=array.length 
           || curr[1]<0 || curr[1]>=array[0].length) {
            return false;
        }
        else if(visited[curr[0]][curr[1]]) {
            return false;
        }
        
        visited[curr[0]][curr[1]] = true;
        if(array[curr[0]][curr[1]]==target) {
            return true;
        }
        else if(array[curr[0]][curr[1]]>target) {
            return rec(array, new int[]{curr[0]-1, curr[1]}, target, visited) 
                || rec(array, new int[]{curr[0], curr[1]-1}, target, visited);
        }
        else {
            return rec(array, new int[]{curr[0]+1, curr[1]}, target, visited) 
                || rec(array, new int[]{curr[0], curr[1]+1}, target, visited);
        }
    }
}
posted @ 2020-10-31 22:06  CodeSPA  阅读(93)  评论(0编辑  收藏  举报