劍指offer:1 二維陣列的查詢
阿新 • • 發佈:2018-12-30
1暴力解法,直接遍歷找值
2如果陣列從右上角出發,則往下轉或往左轉,,如果陣列從左下角出發,則往右轉或往上轉
#include <iostream> #include <vector> using namespace std; class Solution { public: //暴力,遍歷 bool Find(vector<vector<int> > array, int target) { int row = 0, col = 0; bool isFoud = false; for(int i = 0; i < array.size(); ++i) { for (int j = 0;j < array[i].size(); ++j) { if (false == isFoud && target == array[i][j]) { isFoud = true; //找到了就停止 } } } return isFoud; } //右上角出發 bool Findd(vector<vector<int> > array, int target){ int row = array.size(),rol = array[0].size(); bool ret = false; int cool = rol-1; for (int i = 0, j =cool;(i >= 0 && i < row) && (j >= 0 && j < rol);) { if (target == array[i][j]) { ret = true; break; } else if(target < array[i][j]) { cout << "turn left" << endl; j--;//target小就往左轉 } else{ cout << "turn down" << endl; i++;//target大就往下轉 } } return ret; } //左下角出發 bool Finddd(vector<vector<int> > array,int target) { int row = array.size(),rol = array[0].size(); bool ret = false; int cool = row-1; for (int i = cool, j = 0; (i >= 0 && i < row) && ( j >= 0&& j <rol);){ if (target == array[i][j]){ ret = true; break; } else if ( target < array[i][j]) { cout << "turn up" << endl; i--;//target小就往上轉 } else{ cout << "turn right" << endl; j++;//target大就往右轉 } } return ret; } }; int main() { int a1[]={ 1, 2, 8, 9,}; vector<int> vec(a1, a1+4); for(int i = 0; i < 4; i++) { cout << vec[i] <<" ";//輸出 } cout <<endl; int a2[]={ 2, 4, 9, 12,}; int a3[]={ 4, 7, 10, 13,}; int a4[]={ 6, 8, 11, 15,}; vector<vector<int> > array; array.push_back(vector<int>(a1, a1+4)); array.push_back(vector<int>(a2, a2+4)); array.push_back(vector<int>(a3, a3+4)); array.push_back(vector<int>(a4, a4+4));//產生二維陣列 Solution solu; cout << solu.Find(array,7) << endl; //cout << solu.Findd(array,7) << endl; //cout << solu.Finddd(array,9) << endl; //cin.get(); //cin.get(); return 0; }