演算法題 三數之和的多種可能

2021-09-21 06:20:48 字數 2044 閱讀 9954

演算法題: 三數之和的多種可能

這是本人第一次寫部落格,之前總結一些內容都是使用印象筆記,後來覺得筆記這個東西自己記了有的時候很久才會去看,可能根本不會回去再看,索性把自己積累知識的過程寫成blog,這樣你們也可以借鑑參考,何樂而不為呢!

給定乙個整數陣列 a,以及乙個整數 target 作為目標值,返回滿足 i < j < k 且 a[i] + a[j] + a[k] == target 的元組 i, j, k 的數量。

由於結果會非常大,請返回 結果除以 10^9 + 7 的餘數。

示例 1:

輸入:a = [1,1,2,2,3,3,4,4,5,5], target = 8

輸出:20

解釋:按值列舉(a[i],a[j],a[k]):

(1, 2, 5) 出現 8 次;

(1, 3, 4) 出現 8 次;

(2, 2, 4) 出現 2 次;

(2, 3, 3) 出現 2 次。

示例 2:

輸入:a = [1,1,2,2,2,2], target = 5

輸出:12

解釋:a[i] = 1,a[j] = a[k] = 2 出現 12 次:

我們從 [1,1] 中選擇乙個 1,有 2 種情況,

從 [2,2,2,2] 中選出兩個 2,有 6 種情況。

該題目一上來,本人就一頓遞迴暴力求解,先看看讓我死的比較慘的**吧(第一次用不會使用高亮):

//遞迴函式

void

count_group

(vector<

int>

& a,

int target,

int& sum,

int count,

int index)

//不滿足條件直接返回

if(target <

0|| count >3||

(count ==

3&& target >0)

|| index >= a.

size()

)return

;//選擇當前index

target -

= a[index]

; count++

;count_group

(a, target, sum, count, index +1)

;//不選擇當前的index

target +

= a[index]

; count--

;count_group

(a, target, sum, count, index +1)

;}//主函式

intthreesummulti

(vector<

int>

& a,

int target)

這個方法,比較容易理解,就是通過f(n, target) = f(n,target - n(index)) + f(n, target)來進行遞迴的,這個式子的意思是當前所求的組數 = 選擇當前元素所求的組數 + 不選擇當前元素所求的組數。

問題是:複雜度過高複雜度在特殊情況下達到了 n!。

示例:300 個 0;

0;該程式採用遞迴執行了多達半個小時都沒有出來結果,最後擔心記憶體不夠就停止了程式,所以該程式只完成了將近50%的測試用例。下面介紹一種比較直接求解方法:

非遞迴列舉求解:

int

threesummulti

(vector<

int>

& a,

int target)

else

if(a[i]

+ a[j]

==(target - a[k]))

else

}else}}

return res;

}

該演算法複雜度為n2,可以完美ac

題解 三數之和的多種可能 923

給定乙個整數陣列a,以及乙個整數target作為目標值,返回滿足i j k且a i a j a k target的元組i,j,k的數量。由於結果會非常大,請返回結果除以 10 9 7 的餘數。示例 1 輸入 a 1,1,2,2,3,3,4,4,5,5 target 8輸出 20解釋 按值列舉 a i...

LeetCode 三數之和的多種可能(雙指標)

給定乙個整數陣列 a,以及乙個整數 target 作為目標值,返回滿足 i j k 且 a i a j a k target 的元組 i,j,k 的數量。由於結果會非常大,請返回 結果除以 10 9 7 的餘數。示例 1 輸入 a 1,1,2,2,3,3,4,4,5,5 target 8 輸出 20...

LeetCode923 三數之和的多種可能

給定乙個整數陣列 a,以及乙個整數 target 作為目標值,返回滿足 i j k 且 a i a j a k target 的元組 i,j,k 的數量。由於結果會非常大,請返回 結果除以 10 9 7 的餘數。示例 1 輸入 a 1,1,2,2,3,3,4,4,5,5 target 8 輸出 20...