1、数据结构
2、递归:注意到,当矩阵某一行 j 满足 line[i-1]<target, line[i]>target,那么 line[i] 的右下角的所有数字均大于 target,line[i] 的左上角的所有数字均小于 target。即遍历数组,找到满足上述描述的位置,递归遍历该点的左下角。
易错点注意:递归时传递的参数为行和列,根据我的代码逻辑,应该是起始的行和结束的列。
优化解法:观察矩阵发现两个特征点左下角以及右上角,左下角的点往上减小,往右增加;右上角的点,往下增加,往左减小。所以从右上角开始遍历,当结果大于值时向左遍历,当结果小于值时向下遍历,根据此顺序遍历得到目标值。
Go
func searchMatrix(matrix [][]int, target int) bool {
var m, n int=len(matrix), len(matrix[0])
var getTarget func(row, col int) bool
getTarget=func(row, col int) bool{
if row<m && col>=0{
for i:=row; i<m; i++{
for j:=0; j<=col; j++{
if matrix[i][j]==target{
return true
}else if matrix[i][j]>target && j>0 && matrix[i][j-1]<target{
return getTarget(i+1, j-1)
}
}
}
}
return false
}
return getTarget(0, n-1)
}
Java
class Solution {
public int[][] matrix;
public int target;
public boolean searchMatrix(int[][] matrix, int target) {
this.matrix=matrix;
this.target=target;
return getTarget(0, matrix[0].length-1);
}
public boolean getTarget(int row, int col){
if(row<matrix.length && col>=0){
for(int i=row; i<matrix.length; i++){
for(int j=0;j<=col;j++){
if(matrix[i][j]==target){
return true;
}else if(matrix[i][j]>target && j>0 && matrix[i][j-1]<target){
return getTarget(i+1, j-1);
}
}
}
}
return false;
}
}