三數之和題目描述:
給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,
使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。
答案中不允許包含重複的三元組。
示例:
給定陣列 nums =[-
1,0,
1,2,
-1,-
4],滿足要求的三元組集合為:[[
-1,0
,1],
[-1,
-1,2
]]
思路:
1. 首先將陣列排序,可以利用python內建函式,也可以利用另外定義排序演算法。
2. 應用雙指標演算法。固定第乙個數,索引為i,遍歷整個陣列,第乙個數也是三個數中最小的數,然後在該數右面設定左右兩個指標l和r,l=i+1,r=len(nums)-1,
3. 判斷這三個索引指向的元素和與0的大小關係。
和》0,右指標左移一位;和<0,左指標右移一位。
由於要避免重複的三元組,所以移動左右指標的時候要跳過相鄰的所有相等的nums[i]。
python3**:
#匯入計算時間的包,呼叫系統時間
from time import
*#初始時間
t1 = time(
)def
threesum
(nums)
: nums.sort(
) n =
len(nums)
res =
for i in
range
(n):
'''如果相鄰的兩個數相等,跳過,避免重複'''
if i >
0and nums[i]
== nums[i-1]
:continue
l, r = i+
1, n-
1while l < r:
if nums[i]
+ nums[l]
+ nums[r]
>0:
r -=
1while nums[r+1]
== nums[r]
: r -=
1elif nums[i]
+ nums[l]
+ nums[r]
<0:
l +=
1while nums[l-1]
== nums[l]
: l +=
1else
:[nums[i]
,nums[l]
,nums[r]])
l +=
1 r -=
1while nums[l]
== nums[l -1]
: l +=
1while nums[r]
== nums[r +1]
: r -=
1return res
if __name__ ==
'__main__'
: nums =[-
1,0,
1,2,
-1,-
4]print
(threesum(nums)
)#結束時間
t2 = time(
)#執行時間
run_time = t2 - t1
print
(run_time)
執行結果:
[[-
1,-1
,2],
[-1,
0,1]
]#執行時間
0.0010113716125488281
以上**有一些思想錯誤:
遺漏了如果三個數全部大於0,則退出迴圈,因為沒有滿足條件的結果。
沒有嚴格判斷每一次的l修正後的**:
from time import
* t1 = time(
)def
threesum
(nums)
: nums.sort(
) n =
len(nums)
res =
for i in
range
(n-2):
if nums[i]
>0:
break
'''如果相鄰的兩個數相等,跳過,避免重複'''
if i >
0and nums[i]
== nums[i-1]
:continue
l, r = i+
1, n-
1while l < r:
if nums[i]
+ nums[l]
+ nums[r]
>0:
r -=
1while l < r and nums[r-1]
== nums[r]
: r -=
1elif nums[i]
+ nums[l]
+ nums[r]
<0:
l +=
1while l < r and nums[l]
== nums[l-1]
: l +=
1else
:[nums[i]
,nums[l]
,nums[r]])
l +=
1 r -=
1while l < r and nums[l]
== nums[l -1]
: l +=
1while l < r and nums[r]
== nums[r +1]
: r -=
1return res
if __name__ ==
'__main__'
: nums =[-
2,-3
,0,0
,-2]
print
(threesum(nums)
)t2 = time(
)run_time = t2 - t1
print
(run_time)
結果:
[
]#時間
0.0
三數之和 python
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。暴力求解時間複雜度為o n3 無法通過測試 感謝吳彥祖的題解 原來還可以這樣 首先將列表有序化方便排除重複解和確定三個...
15 三數之和(python)
給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 請你找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0 1 1,1,2 class solut...
leetcode 三數之和python
給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 請你找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。示例 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 思路 先對陣列進...