1. 程式人生 > >劍指offer編程-二維數組中的查找

劍指offer編程-二維數組中的查找

ret 程序 思路 mes targe 插入 itl 規律 else if

二維數組中的查找

題目描述

在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

技術分享

#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int rows_num = array.size()-1;
        int cols_num = array[0].size()-1;
        int i = 0;
        while (i<=rows_num && cols_num>=0){
            if (array[i][cols_num] == target)
                return true;
            else if (array[i][cols_num] < target)
                i++;
            else if (array[i][cols_num] > target)
                cols_num--;
        }
        return false;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    vector<vector<int> > array;
    int target;
    vector<int> v;
    int i, j, temp;
    cout << "input array:\n";
    for (i = 0; i < 4; i++){
        v.clear();
        for (j = 0; j < 4; j++){
            cin >> temp;
            v.push_back(temp);
        }
        array.push_back(v);
    }
    cout << "input target:";
    cin >> target;
    
    Solution S;
    if (S.Find(target, array))
        cout << "Yes!";
    else
        cout << "No!";

    cout << "按任意鍵繼續……";
    cin.clear();
    cin.sync();
    cin.get();
    return 0;
}

解題思路:

  • 容易想到但是不易實現的思路:二維矩陣劃分成矩形,能夠縮小區域,貌似是這個道理,但縮小後的區域會有重疊,不知道如何下手實現。
  • 書中的思路:上面代碼實現是這個。每次和數組右上角元素比較,若想等即返回ture;若右上角元素比要找的元素小,則刪除這一行(因為一行中左邊的元素小於右邊的);若右上角的元素比要找的大,則刪除這一列(因為一列中下面的元素比上面的大)。若數組已空還沒找到,返回false。

測試用例:

據說先設計出測試用例能讓面試官刮目相看。面試的時候面試官也通常會讓考慮清楚再動手寫,主要是一些特殊情況,程序的邊界等。

技術分享

程序中語法:

c++ vector 是C++的一個類,動態的數組,需包含頭文件#include<vector>,vector<vector<int>> array是vector構成的vector,賦值時要先對裏層的vector容器賦值,然後再把裏層的vector作為元素插入到外層的vector中。例如例子中的4*4數組插入如代碼中所示,這時候array的size是4,即array中存放著4個vector;array[0]的size是4,即array[0]這個vector中存著4個整數。

簡單但難掌握的大道理:

解決一個復雜的問題時,一個有效的辦法就是從一個具體的問題入手。通過分析簡單具體的例子,試圖尋找普遍的規律。在題目中,就把在數組中尋找7當作具體的例子,去嘗試,當選擇一個角上的元素進行比較時可以每次排除掉一行或者一列,思路就明了了。

劍指offer編程-二維數組中的查找