当前位置: 代码迷 >> 综合 >> letcode 搜索二维矩阵 II
  详细解决方案

letcode 搜索二维矩阵 II

热度:75   发布时间:2023-11-18 03:08:27.0

题目描述:
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
示例:

现有矩阵 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]
]
给定 target = 5,返回 true。

给定 target = 20,返回 false。
思路分析:
根据本题给定的规则可知,该二维数组从左到右,从上到下为升序排序,这时我们可以通过深度优先遍历来查找,找一个节点的下节点和右节点,但是我实现了之后,未能通过全部题库,最后几道超时。经分析可知,是由于重复遍历节点导致的,如1-4,1-2
2-5,2-3,4-5,5-7,5遍历重复,然后就是用空间换时间,使用一个数组来标记给定数组的每个节点,遍历一个这个节点的标记变为1
代码实现:

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int x = matrix.length;if(x<1) return false;int y = matrix[0].length;int i=0;int j=0;//用来标记每个节点的数组int[][] temp = new int[x][y];boolean result = search(i,j,x,y,target,matrix,temp);return result;}//  进行深度优先遍历private  boolean  search(int i, int j, int x, int y, int target, int[][]matrix,int[][]temp) {if(i>=x||j>=y) return false;if(temp[i][j] == 1) return false;temp[i][j] = 1;System.out.println(matrix[i][j]);if(matrix[i][j]>target) return false;else if(matrix[i][j] == target) return true;else {return search(i+1,j,x,y,target,matrix,temp)||search(i,j+1,x,y,target,matrix,temp);}}
}