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

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

从题目意思就是每一行,每一列的数组都是有序的,按照数组下标的增长,数也在增大,只要分成每一行每一行的一维数组,或者分成每一列每一列的一维数组进行二分查找即可。只需判断好数组下标是否会越界,题目就过了。

public boolean Find(int target, int[][] array) {
		//第一行,将每一列的数组都进行二分查找
		for (int i = 0; i < array.length; i++) {
			if (binarySearch(array[i], target)) {
				return true;
			}
		}
		return false;
	}
	
	public static boolean binarySearch(int arr[], int target) {
		//判断数组长度是否大于0,长度长度为0,不进行查询,没有此条件会出现数组下标越界异常
		if (arr.length >= 1) {
			//判断所查找的数是否在当前数组的范围内,不在则不查询
			if (arr[0] < target && arr[arr.length - 1] > target) {
				int low = 0;
				int high = arr.length;
				//二分查找
				while (low <= high) {
					int mid = low + (high - low) / 2;
					if (arr[mid] > target) {
						high = mid - 1;
					} else if (arr[mid] == target) {
						return true;
					} else {
						low = mid + 1;
					}
				}
				return false;
			}
			//判断所查找的数是否等于边界值
			else if (arr[0] == target || arr[arr.length - 1] == target) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值