题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
- 时间限制:1秒
- 空间限制:32768K
个人思路
按照最基础的想法,从左上角进行搜索,上一行搜索不到时,进行下一行从第一个元素进行搜索,结果运行时间和占用内存都较高;
- 运行时间:364ms
- 占用内存:19580K
思考
题目给出的二位数组是有序的,向右或者向下都递增,所以从左上角开始,如果比目标小,向右和向下都增大,不能选择;若从左下角或者右上角进行搜索,如左下角,小则向右,大则向上,选择唯一;
改进1
从左下角开始搜索,代码如下:(从右上角开始类似)
public class Solution {
public boolean Find(int target, int [][] array) {
int len = array.length-1;
int j=0;
while(len>=0&&j<array[0].length){
if(array[len][j]<target){
j++;
}
else if(array[len][j]>target){
len--;
}
else{
return true;
}
}
return false;
}
}
- 运行时间:358ms
- 占用内存:18004K
思路2(超出运行时间)
利用二分查找
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i=0;i<array.length;i++){
int low = 0;
int high = array[0].length-1;
int mid = (low+high)/2;
while(low<high){
if(target>array[i][mid])
low = mid+1;
else if(target<array[i][mid])
high = mid-1;
else
return true;
}
}
return false;
}
}