在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 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。
限制:
0 <= n <= 1000
0 <= m <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题方案1:暴力
[
[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]
]
思路
暴力的思路很简单,就是一个一个的遍历,遇到相等的就直接返回true;否则返回false即可。
代码
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int n = matrix.length;
int m = matrix[0].length;
for(int i = 0;i<m;i++){
for(int j = 0;j<n;j++){
System.out.println(matrix[i][j]);
if(matrix[i][j] == target){
return true;
}
}
}
return false;
}
解题方案2:模拟方向1(从左下角看)
[
[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]
]
思路
- 标签:数组遍历
- 从矩阵的左下角看,上方的数字都比其小,右方的数字都比其大,所以依据规律去判断数字是否存在;
- 舍当前数字为cur,目标数字为target,当target < cur时,cur更新为其上面的数字,当target > cur时,cur更新为其右侧的数字,直到相等则返回true,否则到了矩阵边界返回false;
- 时间复杂度:O(m + n);
代码1
从左下角看
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 ){
return false;
}
int i = 0;//每行的开始
int j = matrix.length - 1;//所有行的结束
int k = matrix[0].length;//每行多少个数据
while ( i < k && j >= 0){
int cur = matrix[j][i];
if (cur == target){
return true;
}else if( cur > target){
j--;
}else if(cur < target){
i++;
}
}
return false;
}
解题方案3:模拟方向(从左上角看)
[
[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]
]
思路
其实从哪个角看无所谓,重要的是,如何把控方向;
- 现在从左上角(⬅️⬆️)看,也就是元素
1,坐标为(0,0)的位置;
- 设:target=5,当前位置的元素的数据为cur;
- (0,0)时,cur=1,cur < 5;则列的位置移动到第二列;此时的坐标为(1,0),cur=4;
- cur(4) > target(5),移动到第二行,此时坐标为(1,1),cur=5
- cur(5) == target(5),则返回true
- 否则找不到,就返回false;
代码
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 ){
return false;
}
int rows = matrix.length;
int columns = matrix[0].length;
int row =0;
int column = columns - 1;
while (row < rows && column >= 0){
int cur = matrix[row][column];
if(cur == target) {
return true;
}
else if(cur > target) {
column--;
}
else {
row++;
}
}
return false;
}