劍指offer面試題4 二維陣列中的查詢

2021-09-28 15:50:29 字數 1726 閱讀 3198

例如:

1  2  8  9

2  4  9  12

4  7  10  13

6  8  11  15

如果在這個陣列中查詢數字7,則返回true;如果查詢數字5,則返回false;

可以從乙個具體的例子開始,尋找普遍的規律。注意到右上角的數字9是所在行的最大數字,所在列的最小數字。假設要查詢的數字是7,那麼與9相比要小,當然也就小於9所在列的其他數字,查詢範圍可以進行縮小(紅色數字表示被排除的區域)。

1  2  8  9

2  4  9 12

4  7  10  13

6  8  11  15

進一步地,取8和7進行比較,8還是大於7,同樣地,排除8所在的這一行。

1  2  89

2  4 912

4  7  1013

6  8  1115

再取2與7進行比較,2小於7,那麼2所在的那一行(這裡指的是剩下的1和2)都會小於7,排除2所在的這一行。

1  289

2  4 912

4  7  1013

6  8  1115

取4與7進行比較,4小於7,刪掉4所在的那一行。

1  289

2  4912

4  7  1013

6  8  1115

再取7與7比較,找到目標數字,返回true。

1  289

2  4912

4  7 

1013

6  8  1115

這樣就可以寫出下面的**:

#include using namespace std;

bool find(int *matrix, int rows, int columns, int number)

else if (matrix[row*columns + column] > number)

--column;

else

++row;

}} return find;

}int main()

,,, };

bool result=find(a[0], 4, 4,7);//這裡的a[0]要十分注意

if (result == true) printf_s("true");

else

return 0; }

//a[0]是乙個指標變數,它指向陣列[1,2,8,9]的起始位址,也可以看做指向的是1的位址,

//那麼也就是整個二維陣列的首元素的位址。這裡不能寫成a,因為a雖然是二維陣列的首位址

//但是二維陣列是將每個一維陣列看做乙個元素,那麼a+1代表第二行的位址,a[0]+1表示第一行第二個

//元素的位址,這是完全不一樣的,千萬注意。

複習:

第二次做的時候想到了用右邊的列來縮小查詢範圍,但是忽略了對稱的利用行也可以減少範圍的情況,以後考慮問題要學會關聯這種對稱的情況。

二刷**:

bool find(int*matrix, int rows, int columns, int number)

else if (matrix[row*columns + column] >number)

else

++rows;

} }return find;

}

劍指offer面試題4 二維陣列的查詢

題目 二維陣列的查詢 在乙個二位陣列中,每一行都遞增,每一列的遞增,請完成乙個函式,查詢二維陣列中是否有number 方案 只需要每次從二維陣列的右上角開始查詢就可以了,因為如果右上角的數字都大於要查詢的number的話,那麼這一列肯定都大於number,我們只需要在剩下的列中找就行了,如果右上角的...

劍指offer面試題4 二維陣列中的查詢

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。include include using namespace std class solution else...

劍指offer 面試題4 二維陣列中的查詢

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution def find self,array,target 判斷陣列是否為空 if a...