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

2021-09-26 19:47:08 字數 838 閱讀 7726

給定乙個集合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數和問題是下面這個問題的擴充套件。

一共想出三種解法,這個題的核心部分不是獲取三個數和為0可能得結果陣列,而是如何實現高效地結果去重,去重演算法的實現影響你是否能提交成功。大部分都卡在了超時這個問題上,包括我剛開始也是,後面優化了去重之後其中兩種方法才提交成功,所以這個題通過率奇低無比。

暴力三層迴圈

在某個測試用例會超時,本來時間複雜度就是o(n^3),還要去重,效率奇低無比,**略。

兩層迴圈+map

三層迴圈的優化版而已,把最後乙個層的迴圈換成map以便快速查詢,時間複雜度降為o(n^2),實現起來也很簡單,去重的部分優化之後成功通過,因為效率一般,**略。

排序雙指標

速度還不錯的解法,邏輯清晰明了,大部分時間都在解決去重的問題,處理的各種特殊的test case了,細節部分**裡有注釋。排序

雙指標去重

var threesum = function(nums) else if(sum<0)else

while(lr--;

l++;

}                  

}}    

}return result;

};

在陣列中找出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個數使得它們和為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 這個問題也被...

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

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