題目:輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。
要求時間複雜度是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是否...