劍指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.二位數組應用:二位數組的查找

有一個二位數組從左到右,從上到下依次增大,如何查找某數字是否存在於數組中?

思路:從右上角或左下角開始尋找

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;
	 }
	
}

測試用例設計:

  最小 中間 最大
查詢存在的測試用例 1 7 15
測試結果: Exist Exist Exist
查詢不存在的測試用例 0 5 20
測試結果 Don't exist Don't exist Don't exist

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章