剑指offer面试题3:在二维数组存储方式、初始化,二位数组应用:二位数组的查找

1.二位数组存储方式:

第一,数组元素在内存中是顺序、连续存储的。
第二,matrix是一个二维数组,二维数组在内存中是按行存放的,即先放第1行,再放第2行……每行中的元素是按列下标由小到大的次序存放,这样的存储方式也称为行优先存储。
第三,这里定义的数组 int *matrix是一个指针数组,指针数组的每个元素都是指针变量。举个例子,如果一个4行4列的二维指针数组,那么他的第2行第3列(row=1,column=2),也就是存储的位置就是row*4+column,即1*4+2=6,存储在第六个位置(位置下标从0开始),那么获得该元素的表示即为matrix[1*4+2].

2.二位数组的初始化

默认初始化:int a[10][10]={0};

全部初始化:

int matrix[4][4]={
    {1,2,8,9},
    {2,4,9,12},
    {4,7,10,13},
    {6,8,10,15}
    };

3.二位数组应用:二位数组的查找

有一个二位数组从左到右,从上到下依次增大,如何查找某数字是否存在于数组中?

《剑指offer面试题3:在二维数组存储方式、初始化,二位数组应用:二位数组的查找》

思路:从右上角或左下角开始寻找

ps:为什么不能从左上角或右下角开始寻找?

因为在左上角比如第一个数的位置,如果寻找的数7比第一行第一列的数1要大,那么它下一个比较的是第一行第二列的数还是第二行第一列的数呢?那就会有重叠。而从右上角或左下角开始寻找就是为了当发现7小于最后一列第一行的数9时,就排除了第四列,依次查询第3列,第2列的第一行。

解答思路及代码 

//思路从右上角开始,逐步排除右边的列,锁定列数后,逐步排除行 
bool Find(int *matrix,int rows,int columns,int numbers)
{
	bool found = false;
	if( matrix != NULL && rows>0 && columns>0)
	{
		int col = columns -1;
		int row = 0;
		while( col>=0 && row<= (rows-1))
		{
			if(matrix[row * 4 + col]>numbers)//在第row行寻找可能所在的列数 
			{
				col --;
			}else{//在第col列寻找可能所在的行数 
				if(matrix[row * 4 + col] == numbers)//numbers等于第一行第col列时 
				{
					found = true;
					break;
				}else{// numbers大于第一行第col列时 ,找这一列的其他行 
					row++;
				}
			}
		}
			
	}
	return found;
}

 

4.测试

主函数:

int main()
{
	int matrix[4][4]={
	{1,2,8,9},
	{2,4,9,12},
	{4,7,10,13},
	{6,8,11,15}
	};
	if(Find(*matrix,4,4,20)==true)
	{
		cout<<"Exist"<<endl;
		return 0;
	 } else{
	 	cout<<"Don't exist"<<endl;
	 	return 0;
	 }
	
}

测试用例设计:

 最小中间最大
查询存在的测试用例1715
测试结果:ExistExistExist
查询不存在的测试用例0520
测试结果Don’t existDon’t existDon’t exist

 

二位数组的存储二位数组matrix[row * columns + column]引用:https://zhidao.baidu.com/question/489919999594033652.html

    原文作者:MaxineZhou
    原文地址: https://blog.csdn.net/MaxineZhou/article/details/104423285
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞