面試題——二維陣列中的查詢
在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
例如下面的二維陣列就是每行、每列都遞增排序。如果在這個陣列中查詢數字7,則返回true;如果查詢數字5,由於陣列不含有該數字,則返回false。
例如下面的二維陣列就是每行、每列都遞增排序。如果在這個陣列中查詢數字7,則返回true;如果查詢數字5,由於陣列不含有該數字,則返回false。
這是前兩天解決的一個問題,寫出來總結一下。
遞迴函式如下,對於查詢矩陣,遞迴如下演算法。
對這個矩陣,從左上向右下方向查詢。
0. 如果當前位置(m, n)的資料等於所求資料,查詢成功。
1. 如果當前位置(m, n)的資料小於所求資料,說明(i <=m && j<=n)位置的資料均小於所求資料。淘汰。則查詢(m + 1, n + 1)。
2. 如果當前位置(m, n)的資料大於所求資料,則(i >m && j>n)位置的資料均大於所求資料。淘汰。則對(i<m && j>=n)以及(i<=m&&j<n)兩個矩陣遞迴查詢。
3. 考慮情況,某個矩陣是1*n或n*1的,也就是一行或一列,那麼就不要按對角線查詢了,按大小遍歷查詢即可。
4. 需考慮矩陣行列不相等情況,比如行到了邊緣,而列沒有。當前資料還小於所查資料,那麼淘汰調這半邊即可,對剩下那半個矩陣遞迴查詢。
時間緊,所述簡略,見諒,程式碼附上。
#include<iostream> using namespace std; int data[100][100]; //引數:所查原始大矩陣行邊界,列邊界,所查矩陣塊的上邊界,下邊界,左邊界,右邊界,所查資料。 int search(int bound_r, int bound_c, int left_i, int right_i, int left_j, int right_j, int find_num){ int i = 0; int j = 0; if(left_i < 0 || left_i > bound_r || right_i < 0 || right_i > bound_r || left_j < 0 || left_j > bound_c || right_i < 0 || right_i > bound_c) return 0; if(left_j == right_j){ //矩陣為一列 for(i = left_i; i <= right_i && data[i][right_j] <= find_num; i++){ if(data[i][right_j] == find_num){ cout << i << " " << right_j << endl; return 1; } } return 0; } if(left_i == right_i){ //矩陣為一列 for(j = left_j; j <= right_j && data[right_i][j] <= find_num; j++){ if(data[right_i][j] == find_num){ cout << right_i << " " << j << endl; return 1; } } return 0; } for(i = left_i, j = left_j; i <= right_i && j <= right_j; i++, j++){ //正常矩陣 if(data[i][j] == find_num){ cout << i << " " << j << endl; return 1; } else if(data[i][j] > find_num){ return search(bound_r, bound_c, left_i, i - 1, j, right_j, find_num) + search(bound_r, bound_c, i, right_i, left_j, j - 1, find_num); } } if(j <= right_j && i > right_i){ //行出界,排除一塊矩陣,對另一塊查 return search(bound_r, bound_c, left_i, right_i, j, right_j, find_num); } if(i <= right_i && j > right_j){ //列出界,排除一塊矩陣,對另一塊查 return search(bound_r, bound_c, i, right_i, left_j, right_j, find_num); } } int main(){ freopen("test.txt", "r", stdin); int i = 0; int j = 0; for(i = 0; i < 4; i++){ for(j = 0; j < 7; j++){ cin >> data[i][j]; } } search(3, 6, 0, 3, 0, 6, 17); // search(3, 3, 0, 3, 0, 3, 8); return 0; }相關文章
- 二維陣列中的查詢陣列
- 【JZOF】二維陣列中的查詢陣列
- 二維陣列查詢陣列
- 九度 二維陣列中的查詢陣列
- JavaScript --二維陣列查詢一維陣列JavaScript陣列
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- 【劍指offer】二維陣列中的查詢陣列
- 九度 1384 二維陣列中的查詢陣列
- 【劍指offer】【1】二維陣列中的查詢陣列
- 微策略面試題:在旋轉後的陣列中查詢元素(二分查詢)面試題陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 【劍指offer】 第三題 二維陣列查詢陣列
- offer通過--3二維陣列中查詢-2陣列
- 劍指offer刷題記錄_2. 二維陣列中的查詢陣列
- 【劍指offer】二分查詢二維陣列陣列
- 劍指Offer積累-JZ1-二維陣列中的查詢陣列
- 演算法學習記錄一(C++)--->二維陣列中的查詢演算法C++陣列
- C的二維陣列(習題)陣列
- nowcoder-劍指offer-二維陣列的查詢陣列
- JavaSE 陣列:一維陣列&二維陣列Java陣列
- 1. 二位陣列中的查詢(劍指offer)陣列
- 【Java】陣列二分查詢元素Java陣列
- 第二章 :查詢與排序-------2.18題目講解_在有空字串中的有序字串陣列中查詢排序字串陣列
- 二維陣列陣列
- js 一維陣列轉二維陣列JS陣列
- js 二維陣列轉一維陣列JS陣列
- PHP二維陣列轉一維陣列PHP陣列
- 陣列中查詢給定值陣列
- 查詢陣列中第K大的元素陣列
- C/C++ 二維陣列的理解(多維陣列)C++陣列
- PHP中二維陣列與多維陣列PHP陣列
- Javascript刷題 》 查詢陣列元素位置JavaScript陣列
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列
- 雙指標查詢陣列的連續規律子陣列問題指標陣列
- vector 二維陣列陣列
- Java二維陣列Java陣列
- JavaScript二維陣列JavaScript陣列