题目:二维数组中的查找
该题目中的这种矩阵被称为杨氏矩阵。
题目描述:
在一个二维数组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
说明: 不存在1,返回false
思想:
这个题目可以用两种方法来解决,第一种就是简单的遍历查找,第二种是利用排除的方法。
方法一:按照我们平常的思路来做,拿到这道题的第一反应就是把这个二维数组遍历一遍
代码实现:
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i = 0;i < array.length;i++){
for(int j = 0;j < array[0].length;j++){
if(target == array[i][j]){
return true;
}
}
}
return false;
}
}
这个题目的本质是查找,在这个二维数组中查找一个与 target 值相等的数,查找其实也是排除的过程,一次排除一个的效率肯定不如一次排除一批的效率高,方法二就是一次排除一批的这种方法。
方法二:从题目中可以看出,这个二维数组的每一行是从左到右递增的,每一列是从上到下递增的。就题目描述中的二维数组来举例:
代码实现:
public class Solution {
public boolean Find(int target, int [][] array) {
int i = 0;
int j = array[0].length - 1;
if(array == null){
return false;
}
while(i < array.length && j >= 0){
if(array[i][j] > target){
j--;
}else if(array[i][j] < target){
i++;
}else{
return true;
}
}
return false;
}
}