题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
示例1
输入
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值
true
说明
存在7,返回true
示例2
输入
3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值
false
说明
不存在3,返回false
方法1:暴力法
思路:
直接遍历全部数组,
当找到需要的数值时返回true,遍历全部后没有找到返回false。
复杂度:
时间复杂度:O(n^2)
空间复杂度:O(1)
代码:
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(array[i][j] == target){
return true;
}
}
}
return false;
}
}
方法二:对角线法
思路:
根据所给的数组的特殊性质:
1.每一行都按照从左到右递增的顺序排序。
2.每一列都按照从上到下递增的顺序排序。
从左下到右上:
可以想到左下角的值 t 是这列最大值,这行最小的值。
然后用 t 和 目标 target比较:
1. 当 t > target 时,因为t是这行最小值,所以想要更小只有向上移动来缩小t的值。
2. 当 t < target时,因为t是这列最大的值,所以想要跟大只有向右移动来扩大t的值。
3. 当 t = target时, 返回 true。
从右上到左下:同理。
复杂度:
时间复杂度: O(行+列)
空间复杂度: O(1)
代码:
public class Solution {
public boolean Find(int target, int [][] array) {
//从左下到右上
int n = array.length;
int m = array[0].length;
int i = n-1, j = 0;
while(i>=0 && j<m){
if(array[i][j] > target){
i--;
}
else if(array[i][j] < target){
j++;
}
else{
return true;
}
}
return false;
}
}