005尋找滿足和為定值的兩個或多個數

2021-09-30 11:16:43 字數 1587 閱讀 5382

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

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

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

分析:思路一:排序,兩頭向中間遍歷,兩頭和大於sum右邊移動←,小於sum左邊移動->,相等,找到輸出,否則退出。

時間複雜度,排序o(nlogn),快排,兩頭遍歷,o(n)。

void findsummand_01(int array,const int n,const int sum)

;int hash_function(int data)

ptr_node q = new node();

q->data=data;

q->next=head[index];

head[index]=q;

}bool find_data(const int data)

return false;

}void findsummand_02(int array,const int n,const int sum)

list1.push_front(n); //典型的01揹包問題

find_factor(sum-n, n-1); //放n,n-1個數填滿sum-n

list1.pop_front();

find_factor(sum, n-1); //不放n,n-1個數填滿sum

}

int main()

則擴充套件題目的**如下:

listlist2;

void findsum(int array,int i,int sum)

;

2、有乙個陣列a,設有乙個值n。在陣列中找到兩個元素a[i]和a[j],使得a[i]+a[j]等於n,求出所有滿足以上條件的i和j。

3、3-sum問題

給定乙個整數陣列,判斷能否從中找出3個數a、b、c,使得他們的和為0,如果能,請找出所有滿足和為0個3個數對。

4、4-sum問題

給定乙個整數陣列,判斷能否從中找出4個數a、b、c、d,使得他們的和為0,如果能,請找出所有滿足和為0個4個數對。

一般性的題目:請編寫乙個程式,當紙片上所寫的數字是k1,k2,k3,k4,..,kn時,是否存在抽取4次和為m的方案(抽完放回),如果存在,輸出yes;否則,輸出no。

最容易想到的方案是用4個for迴圈直接窮舉所有方案,時間複雜度為o(n^4)

//通過4重for迴圈列舉所有方案

for (int a = 0; a < n, a++)}}

}}

再次基礎上進行改進

對於最內層d,是找到乙個數使得ka+ kb +kc + kd = m,即在k中找到乙個數x=m-ka-kb-ka ,因此接下來要做的就是檢視x是否存在於k中,可先將k排序,然後用二分查詢。更近一步,對於c,d兩層,需要檢查是否有滿足kc + kd = m - ka -kb,同樣可以列舉出kc+kd的所得的(n^2)結果並排序,再用二分查詢求解。

尋找和為定值的兩個或多個數

一 尋找和為定值的兩個數 題目 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。詳情參考 用乙個hash表...

尋找陣列中滿足和為定值的兩個數或所有可能組合

方法一 如果陣列是無序的,先排序,然後用兩個指標i j分別指向陣列的首尾兩端,然後i j 逐次判斷a i a j sum 如果某一刻a i a j sum,i不動,j 如果某一刻a i a j 這種演算法的時間複雜度有序o n 無序o n logn 空間複雜度為o 1 public static v...

尋找和為定值的兩個數

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