题目:
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0≤n,m≤500,矩阵中的值满足 0≤val≤10的9次方
进阶:空间复杂度 O(1),时间复杂度 O(n+m)
示例1
输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:true
说明:存在7,返回true
示例2
输入:1,[[2]]
返回值:false
示例3
输入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:false
说明:不存在3,返回false
思路:
- 从二维数组的左下角的元素开始向上,向右遍历,判断当前位置元素的值的大小与target的大小关系:
- 若当前位置元素的值小于target,则当前位置元素继续向右遍历;
- 若当前位置元素的值大于target,则当前位置元素继续向上遍历;
- 若当前位置元素的值等于target,则找到,返回true;否则,返回false。
- 注意,先判断边界条件 。
代码:
public class Solution{
public boolean Find(int target, int[][]array){
//二维数组的行数
int m = array.length;
//边界条件的判断
if(m <= 0){
return false;
}
//二维数组的列数
int n = array[0].length;
//边界条件的判断
if(n <= 0){
return false;
}
//从二维数组的左下角位置元素,即array[m - 1][0]开始遍历
for(int i = m - 1, j = 0; i >= 0 && j <= n -1;){
if(array[i][j] == target){
return true;
}else if(array[i][j] < target){
j ++;
}else{
i --;
}
}
return false;
}
}