在一個二維數組中判斷給定整數是否存在,要求在O(n)內實現

來源:互聯網
上載者:User

題目描述:在一個二維數組中,每一行元素從左至右遞增,從上到下遞增,現輸入一個整數,判斷數組中是否存在該整數,要求時間複雜度為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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.