您的位置:首页 > Web前端

剑指Offer——二维数组中的查找

2016-04-21 13:45 253 查看


在牛客网上刷题:二维数组中查找


题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解决方案有如下三种:
public class 二维数组的查找 {

public static void main(String[] args) {
int[][] array = {{1,2,3},{4,5,6},{7,8,9}};
System.out.println(Find1( array,4));
System.out.println(Find1( array,0));

System.out.println(Find2( array,4));
System.out.println(Find2( array,0));

System.out.println(Find3( array,4));
System.out.println(Find3( array,0));
}

//方法1:选择一个参考点(二选一:左下角或者右上角)
public static  boolean Find1(int [][] array,int target) {

int x =  array.length-1;
int y = 0;
while(x>=0 && y<array[0].length){
if(array[x][y] == target){
return true;
}else if(array[x][y] > target){
x--;
}else y++;
}
return false;
}
//方法二:foreach()方法遍历。。。
public static boolean Find2(int [][] array,int target) {

for(int[] i : array){
for(int j : i){
if(j==target)return true;
}
}
return false;
}
//方法三:把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案, 时间复杂度是nlogn
public static boolean Find3(int [][] array,int target) {

for(int i=0;i<array.length;i++){
int low=0;
int high=array[i].length-1;
while(low<=high){
int mid=(low+high)/2;
if(target>array[i][mid])
low=mid+1;
else if(target<array[i][mid])
high=mid-1;
else
return true;
}
}
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: