tags:
- 三層迴圈
- 雙指標
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例:給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[[-1, 0, 1],
[-1, -1, 2]
]###解法一:暴力法
拿到題目首先想到之前做過的兩數之和,就是遍歷所有的可能組合,儲存滿足條件的組合並去除重複的組合即可。這題是三數之和所以需要用到三重迴圈。實現如下:
def threesum(nums: list[int]):
answer =
nums.sort()
for x in range(len(nums)):
for y in range(x+1,len(nums)):
for z in range(y+1,len(nums)):
if nums[x]+nums[y]+nums[z] == 0:
temp=[nums[x],nums[y],nums[z]]
if temp not in answer:
return answer
測試簡單用例可以通過,但是提交時顯示超過時間限制。於是去翻題解大佬們的解法,記錄如下。
def threesum(nums: list[int]):
ans= #用來儲存結果的列表
if(not nums or len(nums)<3): #排除列表為空或元素數小於3的特例
return
nums.sort() #有小到大排序方便後續的判斷
for i in range(len(nums)):
if(nums[i]>0): #如果最小的i大於0,那麼肯定無法找到滿足條件的結果
return ans
if(i>0 and nums[i]==nums[i-1]): #如果當前元素與上個元素相同,則結果肯定重複,可以跳過
continue
l=i+1 #設定左指標
r=len(nums)-1 #設定右指標
while(l0): #當結果大於0時,說明右指標元素過大,移動右指標
r=r-1
else: #當結果小於0時,說明左指標元素過小,移動左指標
l=l+1
return ans
解法是借鑑題解中的大佬寫得,注釋由個人理解所寫。 三數之和題解
三數之和題解 感謝大神的解答,受益匪淺,對面試和思考演算法有了新的認識,找到了其中的樂趣 三數之和題解 仔細思索,發現雙指標的妙處所在 因為對於有序的序列的話,我從兩頭開始往中間走,如果變大,我可以左指標加一,如果變小,我可以右指標減一 而且我可以取到最大值和最小值,這樣類似乙個有界區間一樣,我可以...
演算法 兩數之和,三數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 leetcode 思路 兩層for迴圈時間複雜度是o ...
4數之和為0(題解)
題意 zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。思路 1.暴力列舉o n 4 2.兩兩枚舉o n 2 利用桶排 3.兩兩分組,一組求和排序 ...