找出陣列中和為N 1的的所有組合

2021-06-09 00:38:22 字數 1627 閱讀 4863

乙個整數數列,元素取值可能是1~n(n是乙個較大的正整數)中的任意乙個數,相同數值不會重複出現。

設計乙個演算法,找出數列中符合條件的數對的個數,滿足數對中兩數的和等於n+1。

複雜度最好是o(n),如果是o(n2)則不得分

方法一:排序後,定義兩個指標begin,end分別指向陣列的第乙個和最後乙個元素。然後按以下規則移動指標:

1.  如果*begin + *end = n+1,那麼找到乙個解,同時begin++,end--

2.  如果*begin + *end > n+1,那麼說明不等式後項應該減小,所以end--;

3.  如果*begin + *end < n+1,那麼說明不等式前項應該增大,所以begin++;

4.  重複以下過程直到end**如下:

int main()

; int sum = 11;

int len = sizeof(a)/sizeof(int);

sort(a,a+len);

int high = len-1;

int low = 0;

while(low方法二:構建乙個輔助陣列b,b[i] = n+1 – a[i].然後建立兩個指標分別指向陣列a的頭部(begin),和陣列b的尾部(end)。按以下規則移動指標:

1.  如果a[begin] == b[end],那麼找到一組解a[end]+b[end]=n+1,begin++,end--;

2.  如果a[begin] > b[end],那麼end--;

3.  如果a[begin] < b[end],那麼begin++;

4.  直到begin>end;

時間複雜度為o(n),空間複雜度o(n);

using namespace std;

int main()

; int sum = 11;

int len = sizeof(a)/sizeof(int);

int *b = (int *)malloc(sizeof(len));

for(int i=0;ib[high])

else

} getchar();

return 0;

}

方法三. 用hashmap或者hashset來解決

def combine_sum(nums, target):

s_set = set()

for num in nums:

if target - num in s_set:

print('%d + %d = %d ' % (num, target - num, target))

else:

s_set.add(num)

if __name__ == '__main__':

nums = [1,3,5,6,7]

combine_sum(nums, 8)

找出陣列中和為10的元素的組合

find all subsets that sum upto 10.example int arr subsets are 4,5,1 4,6 2,3,5 etc.include stdafx.h include using namespace std void printvec std vecto...

找出和為k的所有組合

1.題目 給定乙個陣列a a中不存在重複元素 和乙個值k,求出a中元素之和為k的所有組合。比如a為,k 7,則所有組和有2 2 3和7。2.解析 回溯 遞迴。比較難以理解的是index索引的使用,如下 void printsum int candidates,int index,int n targ...

數列中和為定值的所有組合

輸入兩個整數 n 和 m,從數列1,2,3 n中隨意取幾個數,使其和等於 m 要求將其中所有的可能組合列出來。設該演算法為f m,n 返回乙個陣列集合r 則f m,n 1 返回集合r1 且f m n,n 1 返回集合r2 在r2中的每個陣列中加入元素n,得到r3 則r r1 r3 終止條件是n 0或...