Python三數之和

2021-10-11 10:04:40 字數 3339 閱讀 9011

三數之和題目描述:

給你乙個包含 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 思路 先對陣列進...