在陣列中找出3個數使得它們和為k

2021-06-15 03:59:43 字數 1208 閱讀 1822

給定乙個集合s,試找出3個數a, b, c,使得a+b+c=0。也即從集合中找出所有的和為0的3個數。

例如:集合s=,則滿足條件的3個數有2對:

(-1, 0, 1)和(-1, 2, -1)。注意(-1,1,0)與(-1,0,1)算同乙個解,所以不用重複考慮。當然該例子集合的解也可以寫成:(0, 1, -1)

和(2, -1, -1)

這個問題也被稱作3數和問題,3數和問題是下面這個問題的擴充套件。

問題:給定乙個n個元素的集合s,找出s中滿足條件的整數對a,b,  使得a+b=k

假定集合s已經排好序的話,則上面這個問題可以在o(n)的時間內解決。使用2個索引值first和last,分別指向第乙個元素和最後乙個元素,設指向的第乙個元素為a,則我們的任務就是找到對應於a的元素b,b=k-a。如果last指向的元素小於b,則first加1,指向後面的乙個元素;如果last指向的元素大於b,則last減1。這樣最終一步步逼近結果,時間複雜度為o(n)。該演算法**如下:

/*k為和,a為元素陣列,n為陣列大小*/  

void findsum(int k, int a, int n)

}if (!found)

cout << "not found" << endl;

}

在上面這個解法的基礎上,我們可以在o(n^2)的時間內解決3數和(a+b+c=k)問題。這裡稍有不同的是,上面問題的和k不一定是陣列中的元素,它只是程式指定的乙個引數。而在3數和問題中,如果轉化為a+b=k-c的問題,還需要保證k-c在陣列中。下面**採用了兩個迴圈,第乙個迴圈代表初始值,即先是第乙個值a[0]不變,計算a[0]+a[1]+a[n-1],若大於k則i減1,計算a[0]+a[1]+a[n-2],若小於k則j加1,計算a[0]+a[2]+a[n-1]...如果存在多個重複值,這可能會加入重複的數對,不過使用資料結構set可以解決該問題,相同的數對不會出現在set中。

set> find_triplets(vectorarr)

else if (sum> 0) else

}} return triplets;

}

在陣列中找出3個數使得它們和為0

給定乙個集合s,試找出3個數a,b,c,使得a b c 0。也即從集合中找出所有的和為0的3個數。例如 集合s 則滿足條件的3個數有2對 1,0,1 和 1,2,1 注意 1,1,0 與 1,0,1 算同乙個解,所以不用重複考慮。當然該例子集合的解也可以寫成 0,1,1 和 2,1,1 這個問題也被...

在陣列中找出3個數使得它們和為0

leetcode上的原題,美圖的筆試題目。本質上這個問題是2數之和的問題擴充套件 在給定的陣列中找出兩個數a,b,使得a b sum。三個數之和為0,即a b c 0,可以轉化為a b c,這需要保證 c在陣列中。下面 採用了兩個迴圈,第乙個迴圈代表初始值,即先是第乙個值a 0 不變,計算a 0 a...

在陣列中找出3個數使得它們和為k

給定乙個集合s,試找出3個數a,b,c,使得a b c 0。也即從集合中找出所有的和為0的3個數。例如 集合s 則滿足條件的3個數有2對 1,0,1 和 1,2,1 注意 1,1,0 與 1,0,1 算同乙個解,所以不用重複考慮。當然該例子集合的解也可以寫成 0,1,1 和 2,1,1 這個問題也被...