leetcode 15 三數之和

2021-09-28 07:22:44 字數 1920 閱讀 4836

leetcode題目鏈結

題目要求:在陣列中查詢和為0的3個元素(不能重複)

找3個元素和為0,3層迴圈,暴力破解肯定不行。

如果是找2個元素,比較簡單,用字典。找3個,沒思路。

參考部落格

先對陣列進行排序

最外一層迴圈,i 走一遍,作為第乙個元素

在最外一層迴圈內,left 和 right 分別向中間靠攏。

還要避免重複

def

threesum

(self, nums)

: res =

nums.sort(

)##先對元素進行排序

i =0 numslen =

len(nums)

while i

#以i為找到的第乙個元素為基準

if nums[i]

>0:

break

left=i+

1 right=

len(nums)-1

#left和right指標指向另外2個指標

while left

#left向右,right向左

iszero = nums[i]

+nums[left]

+nums[right]

if iszero==0:

[nums[i]

,nums[left]

,nums[right]])

left+=

1 right-=

1elif iszero>0:

#和大於0,right向左

right-=

1else

:#和小於0,left向右

left+=

1 i+=

1 s =

#篩選去掉重複元素

for i in res:

if i not

in s:

return s

要在整個思路框架中,解決判斷重複的問題。

def

threesum2

(self, nums)

: res =

nums.sort(

) i =

0 numslen =

len(nums)

while i

if nums[i]

>0:

break

if i>

0and nums[i]

==nums[i-1]

:#會衝突,直接跳過

i+=1continue

left=i+

1 right=

len(nums)-1

while left

iszero = nums[i]

+nums[left]

+nums[right]

if iszero==0:

[nums[i]

,nums[left]

,nums[right]])

#會衝突,直接跳過

while left

==nums[left]

: left+=

1#會衝突,直接跳過

while left

==nums[right]

: right-=

1 left+=

1 right-=

1elif iszero>0:

right-=

1else

: left+=

1 i+=

1return res

LeetCode 15 三數之和

15.給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組 方法一,個人解法正確,但是效率太低,時間複雜度o n 3 時間超時,無法提交至leetcode public s...

leetcode 15 三數之和

給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 class solutio...

leetcode15 三數之和

給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 先找兩數之和,然後再用un...