尋找和為定值的兩個數

2022-02-05 04:17:48 字數 2078 閱讀 7088

題目:輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。

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

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

解析:如果陣列是無序的,先排序(n*logn),然後用兩個指標i,j,各自指向陣列的首尾兩端,令i=0,j=n-1,然後i++,j--,逐次判斷 a[i]+a[j]?=sum,如果某一刻a[i]+a[j]>sum,則要想辦法讓sum的值減小,所以此刻i不動,j--,如果某一刻 a[i]+a[j]有序的,則不需要事先的排序,直接o(n)搞定,且空間複雜度還是o(1),此思路是相對於上述 所有思路的一種改進。(如果有序,直接兩個指標兩端掃瞄,時間o(n),如果無序,先排序後兩端掃瞄,時間o(n*logn+n)=o(n*logn),空間始終都為o(1))

總結

這裡假定陣列已經是有序的,**可以如下編寫(兩段**實現):

bool findnumberswithsum(int data, int length, int sum, int *num1, int *num2)

else

if(cursum >sum)

ahead--;

else

behind++;

}return

found;

}

測試**:

1 #include2

using

namespace

std;34

bool find_num(int data , int length , int sum , int &first_num , int &second_num)522

else

if(current_sum >sum)

23 end--;

24else

25 begin++;26}

27return

false;28

}2930int

main()31;

33int length = sizeof(data)/sizeof(int

);34

int first_num = 0;35

int second_num = 0;36

int sum = 15;37

38if(find_num(data , length , 15

, first_num , second_num))

3942

else

43 cout<

not exist!

"<

4445

return0;

46 }

尋找是否存在兩個數的和為定值

尋找和為定值的多個數:

2023年中興面試題

程式設計求解:

輸入兩個整數 n 和 m,從數列1,2,3.......n 中 隨意取幾個數,

使其和等於 m ,要求將其中所有的可能組合列出來。

1 #include2 #include3

using

namespace

std;

45 listlist1;

6void find_factor(int sum, int

n) 7

2223 list1.push_front(n); //

典型的01揹包問題

24 find_factor(sum-n, n-1); //

放n,n-1個數填滿sum-n

25list1.pop_front();

26 find_factor(sum, n-1); //

不放n,n-1個數填滿sum

27}

2829

intmain()

30

尋找和為定值的兩個數

尋找和為定值的兩個數 給定乙個陣列 無序或者有序,兩種情況都要考慮 找出和為m的兩個數。最多時間複雜度能有多少?陣列有序的情況,在時間複雜度上我們就省去了排序的o nlogn 我們使用兩端指標掃瞄法是比較簡單的,時間複雜度為o n 空間複雜度為o 1 如下圖所示 然後,判斷它們指向的值之和sum是否...

尋找和為定值的兩個數

描述 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。分析 如果採取窮舉,複雜度為o n 2 可以換乙個思...

尋找和為定值的兩個數

題目 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。解析 如果陣列是無序的,先排序 n logn 然後用...