题目描述:
编写一个高效的算法来搜索 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);}}
}