微軟等數據結構+算法面試100題014

/*

*

*  題目:輸入一個已經按升序排序過的數組和一個數字,

*  在數組中查找兩個數,使得它們的和正好是輸入的那個數字。

*  要求時間複雜度是O(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。

*  例如輸入數組1、2、4、7、11、15和數字15。由於4+11=15,因此輸出4和11。

 

*  思路:類似快排的partion 部分 從兩邊開始向中間找

   比如有如下數組輸入數組1、2、4、7、11、16和數字15

   選定1  從右邊開始找 選定16 1+16>15 

                       選定11 1+11<15 這時候應該放棄1 因爲 1 已經不可能存在解了。

   選定11 從左邊開始找 選定2  2+11<15

  選定4  4+11=15 得解

 

直到兩邊一直找到中間。無有效解則顯示失敗

*/

 

#include <iostream>

 

 

int main()

{

int data[]={1,2,4,7,11,15};

int flag = 0, start = 0, end = 5, key;

int sum =15;

while ( start < end  && !flag){

key = data[start];

while( start < end && !flag && key + data[end] >= sum ){

if ( key + data[end] == sum) {

flag = 1 ;

}

else

end--;

}

if (!flag) {

start++;

key = data[end];

while ( start < end && !flag && key + data[start] <= sum ){

if ( key + data[start] == sum) {

flag = 1 ;

}

else

start++;

}

if (!flag) {

end--;

}

}

}

if( flag)

std::cout<<"data["<<start<<"]="<<data[start]<<" data["<<end<<"]="<<data[end]<<std::endl;

return 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章