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

       本系列的文章是作者在读何海涛所著的《剑指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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值