題目描述:在一個二維數組中,每一行元素從左至右遞增,從上到下遞增,現輸入一個整數,判斷數組中是否存在該整數,要求時間複雜度為O(n)
思路:可以數組分為三個部分,數組右上方,左邊,下面
例如:數組如下
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
尋找元需為7,數組右上方元素為9
因為7<9,則在9左邊的三列中尋找7元素,將col減1
1 2 8
2 4 9
4 7 10
6 8 11
再取數組右上方元素8,7<8,則在8左邊的兩列中尋找7元素,將col減1
1 2
2 4
4 7
6 8
再取數組右上方元素2,7>2,則在2下邊三行中尋找元素7,注意此時的3行,值
2 4
4 7
6 8,前面已經將col至2啦
再取數組的右上方元素4,7>4,則在4下邊2行中尋找
4 7
6 8
再取數組的右上方元素7,7==4,返回,尋找成功
具體實現代碼如下:
//array(實質為二維數組)數組的特徵:從左至右遞增,從上到下遞減//思路:先將num與右上方的元素相比較,相等則直接返回,表示找到//小於,則在左邊的列尋找,將列數減一//大於,則在下放元素尋找,將行數增一bool find_num(int *array, int *index, int rows, int cols, int num){bool flag=false;//int temp = array[col-1];if(array!=NULL && cols>0 && rows>0)//判斷參數的有效性{int row=0, col=cols-1;//與右上方的數字比較while(array!=NULL && row<rows && col>0){if(num==array[row*cols+col]){flag=true;index[0] = row;index[1] = col;break;}else if(array[row*cols+col]>num)--col;else++row;}}return flag;}int main(void){int index[2] = {0};int array[]={1, 2, 8, 9, 2, 4, 9, 12, 4, 7, 10, 13, 6, 8, 11, 15};bool ret = find_num(array, index, 4, 4, 7);cout << ret << " " << index[0] << " " << index[1] << endl;return 0;}