劍指offer編程-二維數組中的查找
阿新 • • 發佈:2017-08-23
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編程-二維數組中的查找