题目描述:
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
0 <= array.length <= 500
0 <= array[0].length <= 500
java code
法1;暴力法
暴力法很简单遍历二维数组因此时间复杂度是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[i].length;j++){
if(target==array[i][j])
return true;
}
}
return false;
}
}
但是暴力法没有利用题目给出的信息
法2:题目中的数组有顺序信息,由此想到有序数组的二分法查找,但这里是二维数组可以从右上角或者左下角出发,然后与target比较,改变i和j的值。这里注意判断条件:要使i和j在数组的范围内。
public class Solution {
public boolean Find(int target, int [][] array) {
int n=array[0].length;
int j=n-1;
int i=0;
//int val=array[i][j];//从右上角开始,一直向下走,注意while里的内容
while(i<n&&j>=0)//因为行是增加的所以i<n,而列是减少的所以j>=0
{
if(target<array[i][j])
j--; //因为当前val正下一行值肯定比target大,因此要向左走,
else if(target>array[i][j])
i++;
else
return true;
}
return false;
}
小王加油~day1