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);
}
}
}