时间限制:1秒
空间限制:32768K
热度指数:478583
本题知识点: 查找
算法知识视频讲解
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
分析:大体上有两种方法
一种是每一行都采用一次二分搜索,时间复杂度为n(log n)
另一种是利用二维数组由上到下,由左到右递增的规律,
那么选取右上角或者左下角的元素a[row][col]与target进行比较,
当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
即col--;
当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
即row++;
显然是第二种方法更为巧妙,简便,耗时少
下面AC代码:
public class Solution {
public boolean Find(int target, int [][] array) {
//先防护
if(array == null || array.length == 0){
return false;
}
//使用二分
for(int i = 0;i<array.length;i++){
int minp = 0;
int maxp = array[i].length;
if(array[i].length == 0){
continue;
}
if(target>=array[i][0] && target<=array[i][array[i].length-1]){//如果在第i行
while(maxp>=minp){
int p = (minp+maxp)/2;//指针
if(target == array[i][p]){
return true;
}else if(target < array[i][p]){
maxp = p-1;
}else{
minp = p+1;
}
}
}
}
return false;
}
}
public class Solution {
public boolean Find(int target, int [][] array) {
//if(array == null || array.length == 0){
// return false;
//}
//从右上角开始
int row = 0;//第0行
int col = array[0].length-1;//第0行 最后一个
while(row<=array.length-1 && col>=0){
if(target == array[row][col]){
return true;
}else if(target > array[row][col] ){
row++;
}else{
col--;
}
}
return false;
}
}