面試題——二維數組中的尋找

來源:互聯網
上載者:User

 在一個二維數組中,每一行都按照從左至右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
   
  例如下面的二維數組就是每行、每列都遞增排序。如果在這個數組中尋找數字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;}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.