(剑指offer)二维数组中的查找

题目描述

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

解题思路:

1.暴力解法:因为每一行是从大到小,所以在遍历每一行时,可以使用折半查找。平均复杂度为O(nlogm)

2.简单解法:我们先分析题目,把二维数组在纸上画成一个矩形。列如:1 2 8 9

                                       2  4  9   12  

                                       4  7 10  13     

                                       6  8  11  15

然后从数组中选取一个数字7。

如果我们从左上角(也就是2)开始查找,一直到终点右下角(也就是15)。当选取的数字跟要查找的数字相等时,结束。当选取的数字小于要查找的数字时,要查找的数字应该在当前选取数字的右边或者下边。当选取的数字大于要查找的数字时,要查找的数字应该在当前选取数字的左边或者上边。这种情况有可能会出现重叠区域,游标到某处会往回走的现象,代码不太容易实现。

我们可以换种角度思考,减少查找的范围,我们每次都以右上角的数字作为标准进行比较,当查找的数字小于右上角的数字时,剔除该数字所在的这一列。当查找的数字大于右上角的数字时,剔除该数字所在的这一行。慢慢的减少查找的范围,最终找到该数字。平均复杂度为O(n+m)

代码实现如下:

public class subject_1 {
	/***********************************************************************
	 * 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
	 * 每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个
     *整数, 判断数组中是否含有该整数。
	 ***********************************************************************/
	public static void main(String[] args) {
		int[][] array ={{ 1, 2, 3, 4},
				        { 2, 4, 6, 7},
				        { 3, 5, 8, 9},
				        { 4, 8, 9, 10},
				        { 5, 9, 10,11}};
		boolean find = Find(0, array);
		System.out.println(find);
	}
	public static boolean Find(int target, int[][] array) {
		int row = array.length; // 行长
		int column = array[0].length;// 列长
		boolean find = false;
		int i = 0, j = column - 1;
		while (i < row && j >= 0) {
			int position = array[i][j];
			if (target == position) {
				find = true;
				break;
			} else if (target < position)
				j--;
			else {
				i++;
			}
		}
		return find;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值