剑指offer面试题4:二维数组中的查找

索引请参考:系列目录
题目:

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

  • 例:

  • 输入:

  • 在这里插入图片描述

  • 查找:7 返回true 5 返回false

  • 思路:

    • 从此有序数组中选取一个数字,分三种情况:
      • (1)当数组选取的数字刚好和要查找的数字相等时,结束查找过程
      • (2)选取的数字小于要查找的数字,根据数组排序的规则,要查找的数字应该在当前 选取位置的右边或下边
      • (3)选取的数字大于要查找的数字,要查找的数字应该在当前选取位置的上边或者左边
    • 根以上三种情况,本题选择数组中右上的数字开始查询
  • 分析

  • (1)首先选取数组右上角的数字9,由于9>7,并且9位于第4列第一个(最小的),因此7不可能出现在此列,删除该列
    在这里插入图片描述

  • (2)重复步骤(1)删除8所在的列
    在这里插入图片描述

  • (3)由于2<7,所以有可能在该列

    • 1)由于2<7,所以7不可能出现在该行,删除该行
      在这里插入图片描述
    • 2)重复步骤1)删除4所在的行
      在这里插入图片描述
    • 找到返回true
  • (4)若没找到,返回false

bool findTwoDimensionalArrayElements(const int target, const std::vector<std::vector<int>> & array) {

	int startX = array[0].size() - 1;
	int startY = 0;
	const int endY = array.size() - 1;

	while (startX >= 0 && startY <= endY)
	{
		if (array[startY][startX] > target)
			--startX;
		else if (array[startY][startX] < target)
			++startY;
		else
			return true;
	}
	return false;
}

牛客运行结果:
在这里插入图片描述
评注:该方法巧妙的利用了排序数组这一规律,将查找算法的时间大大缩小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值