您的位置:首页 > 职场人生

剑指offer——面试题3二维数组

2016-03-16 22:24 513 查看
       本系列的文章是作者在读何海涛所著的《剑指offer——名企面试官精讲经典面试题》时将里面的一些题用java做实现,以供大家参考学习。

       面试题3:在一个二维数组中,每一行都是从上到下递增,每一列都是从左到右递增,设计一个函数实现输入一个这样的二维数组和一个数查找其是否存在。

      分析:在二维数组中查找是否存在某一个数,遍历是绝对可行的但问题是实在是太慢了,实际上可以这样来思考:数组是有规律的:从上到下是递增的,从左到右也是递增的那么我们可以找一个角的数据来进行比较,比如右上角,如果这个值等于要查找的数那么直接返回true如果这个值比要查找的数大,那么就直接去掉这个值所在的这一列(因为右上角的数是这一列的数里面最小的),如果这个值小于要查找的那个值,那么就去掉这个值所在的这一列,如此循环即可。那么代码就很容易写了,java代码如下:

package Array;

/*
* 实现的功能:在一个二维数组中找到某一个数
* 该二维数组的特性是:每一行从左到右递增,每一列从上到下
* 实现思路:先找某一个角上的数字比较然后通过比较大小来确定删除数组的一行或者一列
*/
public class FindNum {
/*
* objArray:二维数组
* num:要查找的数字
*/
public boolean findNum(int[][] objArray,int num){
boolean flage=false;
if(objArray.length>0&&objArray!=null){
int columns=objArray[0].length;//总列数
int rows=objArray.length;//总行数
int row=0;//查找的行数,从第一行开始
int column=columns-1;//查找的列数,从最后一列开始
while(row<rows&&column>=0){
if(objArray[row][column]==num){
flage=true;
break;
}else if(objArray[row][column]>num){
column--;
}else if(objArray[row][column]<num){
row++;
}
}
}
return flage;
}
}
测试类:

package Array;

public class Test {
public static void main(String[] args) {
int[][] obj=new int[][]{{1,2,8,9},{2,4,9,12},{3,7,10,13},{4,11,15,17}};
for(int i=0;i<obj.length;i++){
for(int j=0;j<obj[0].length;j++){
System.out.print(obj[i][j]+"\t");
}
System.out.println();
}
FindNum fn=new FindNum();
System.out.println(fn.findNum(obj, 6));
}
}


输出结果是:false
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: