《剑指offer》:[8]二维数组中的查找

原创 2016年05月30日 15:20:55
解决问题:二维数组中的查找:

     二维数组是一个比较常用的数据结构,主要由于其顺序存储,其下标引用的查找和访问的随机性优点尤其突出,使其在O(1)时间内就可以访问我们想要的位置数据。

例如我们想要看第10个的数据内容,那么直接取a[9]就可以了,十分方便。但是它也有缺点,那就是插入和删除时效率较低,正因为其连续存储的数据结构,所以在每次插入和删除后都需要移动大量的数据。所以导致其效率比较低下。

下面主要来讨论一下在二维数组中查找一个数据的方法。
方案一:顺序搜索法。其时间复杂度为O(M*N);M/N分别为数组的行和列,比较低效。代码实现也比较简单,这里不做多的介绍。
方案二:二维法。这是我自己给它取的一个名字,主要是充分利用二维数组的逻辑内存存储方式。利用二维空间来解决,也称“去行去列查找法”,同样自创(可以吐槽,呵呵。。)。
具体条件方法如下:
假设该数组中的数据每行从左到右,每列从上到下,都是递增排列。
首先选取数组右上角的数字,
(1)如果该数字等于要查找的数字,则返回,查找成功;
(2)如果该数字小于查找的数字,去掉该行;
(3)如果该数字大于查找的数字,去掉该列;

循环执行(2)(3),直至查找结束;

我觉得画图更直观,如下图所示:


具体实现代码如下:

#include <iostream>
using namespace std;
int array[4][4]={{1,2,4,6},
				 {2,3,5,7},
			     {5,8,10,15},
				 {7,9,12,23}};
int find_value(int (*arr)[4],int rows,int columns,int findvalue)
{
	int row=0;
	int column=columns-1;
	int count=0;
	if(NULL==arr || rows<=0 ||columns<=0)
		return -1;
	if(NULL!=arr && rows>0 && columns>0)
	{
		while(row<rows && column>=0)
		{
			count++;
			if(arr[row][column]==findvalue)
			//条件也可以变为:if(arr[row*columns+column]==findvalue)
			{//查找成功;
				cout<<"比较次数:"<<count<<endl;
				return findvalue;
			}
			else if(arr[row][column]>findvalue)
			{
				column--;
			}
			else
			{
				row++;
			}
		}
	}
	cout<<"比较次数:"<<endl;
	return 0;  //查找失败!
}
int main()
{
	int result=find_value(array,4,4,8);
	if(-1==result)
		cout<<"数据有误!"<<endl;
	else if(0==result)
		cout<<"查找失败,没有该数据!"<<endl;
	else
		cout<<"查找成功:"<<result<<endl;
	system("pause");
	return 0;
}
运行结果:


从运行结果和图可以看出,查找的次数也为5,。如果按方案一则需要查询10次,效率提高了一倍。如果数据量大,则效果更明显。






版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

如何将二维数组作为函数的参数传递

如何将二维数组作为函数的参数传递   今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理...
  • xuleicsu
  • xuleicsu
  • 2006年07月14日 10:39
  • 27717

剑指offer_面试题3_二维数组中的查找(简单问题亦不能忽视)

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

重新解读剑指Offer之3题 二维数组中的查找

首先描述一下问题,存在一个二维数组,每一行数据从左到右递增,每一列数据从上到下递增。给定一个需要查找的参数,问在这个参数是否在二维数组中。关于几种不同算法的解释与实现。...
  • yandmi
  • yandmi
  • 2017年03月08日 18:00
  • 506

【剑指offer】面试题3:二维数组中的查找

题目:在一个二维数组中,每一行从左到右递增,每一列从上到下递增,在这个二维数组中,查找给定的数是否存在。 分析:遍历来查找的事这里就不说了,像星爷说的:“像我这么理智的人,怎么会相信这么无稽的事情。...

剑指offer刷题之java实现的二维数组中的查找

/** * * @author 毛二 * @data 2015-8-8 * @comments * 二维数组中的查找。其中二维数组,每行数递增。每列数也递增。 * 那么,二维数...

剑指Offer—— 题3 二维数组中的查找 Java版

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路: 关键要...
  • RHCDS
  • RHCDS
  • 2015年11月23日 10:29
  • 287

剑指Offer---面试题3:二维数组中的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列.请完成一个函数,输入这样的一个二维数组,判断数组中是否含有该整数.分析:例如如下数组,查找7是否存在于该...

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

链接 牛客OJ:二维数组中的查找 九度OJ:http://ac.jobdu.com/problem.php?pid=1384 GitHub代码:gatiemee/CodingI...
  • gatieme
  • gatieme
  • 2016年04月08日 21:53
  • 1637

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

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

《剑指offer》——1 二维数组中的查找

二维数组中的查找 参与人数:6536时间限制:1秒空间限制:32768K 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《剑指offer》:[8]二维数组中的查找
举报原因:
原因补充:

(最多只允许输入30个字)