0
点赞
收藏
分享

微信扫一扫

剑指Offer 二维数组中的查找



时间限制: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;
}
}



举报

相关推荐

0 条评论