讓人瑟瑟發抖的面試題
。
。
。ios
來咱們看一下題目
在一個二維數組中,每一行都按照從左到右遞增的順序操做。每一列都按照從上到下遞增的順序排序。完成代碼,輸入這樣一個二維數組和一個整數,判斷數組是否含有該整數面試
怎麼解決勒???
分析:若是二維數組是這樣,爲了解決問題徹底能夠把數組遍歷一遍,可是爲了效率,咱們須要把時間複雜度下降,爲了遍歷最少的數字,咱們須要把行和列分開。因此,咱們會從數組中找一個數字進行判斷,然而,隨便找一個數字,只會讓問題變的跟複雜,好比,找一個10,左邊和上邊都比10小,而下邊和右邊都比10大,因此,咱們只能找一些特殊點,好比,右上邊,左下邊,只會有一條路讓你選擇。a[row][col],咱們拿9舉例,若所找數字比9大,只需row++;若所找數字比9小,只需col--;直到最後找到所需數字。
來看看代碼數組
#include<iostream> using namespace std; bool find(int *arr, int row, int col, int n) { bool flag = false;//標記 if (arr != nullptr&&row > 0 && col > 0)//判斷數組是否存在 { int _row = 0; int _col = col - 1; while (_col>0&&_row<row) { if (arr[_row*col + _col] > n) { _col--; } else if (arr[_row*col + _col] < n) { _row++; } else { flag = true; return flag; } } } return flag; } int main() { int arr[4][4] = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } }; bool ret=find((int *)arr, 4, 4, 7);// cout << boolalpha << ret<<endl;//boolapha使返回值變成true輸出 return 0; }