面试题4:二位数组中的查找

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

例如:在一下数组中寻找数字7

1    2     8      9

2    4     9     12

4    7    10    13

6    8    11    15

思路:由于数组是从左到右,从上到下递增的,那么可以选取右上角的元素9,由于9>7,那么9同列的数都>=9,所以可以排除9这一列,剩下4行3列,再去右上角8,8>7,排除8这一列,剩下4行2列,取右上角2,2<7,由于2现在这行的数(只剩两列了)都<=2,所以可以排除2这一行,剩下3行2列,取右上角4,4<7排除4这一列,剩2行2列,取右上角7,7=7,找到元素。

解法:(时间复杂度为O(logn),空间复杂度为O(1))

public class Test1 {
	public static void main(String[] args) {
		int[][] a={{1,2,8,9},{2,4,9,12},{4,5,10,13},{7,8,11,15}};
		boolean b=findNumber(a,7);
		if(b){
			System.out.println("数组中含有该元素");
		}else{
			System.out.println("数组中没有该元素");
		}
	}
	private static boolean findNumber(int[][] a, int i) {
		if(a==null||a.length<=0){
			return false;
		}
		int row=0;
		int col=a[0].length-1;
		while(row<a.length&&col>=0){
			int p=a[row][col];
			if(p==i){
				return true;
			}else if(p>i){
				col--;
			}else{
				row++;
			}
		}
		return false;
	}
}

 

今天一分的努力换取明天一分的轻松,明天十分的努力可能都换不来后天一分的轻松。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值