題目
給你一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有和為 0 且不重復的三元組,
注意:答案中不可以包含重復的三元組,
示例1
輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]
示例2
輸入:nums = []
輸出:[]
示例3
輸入:nums = [0]
輸出:[]
提示
(1)0 <= nums.length <= 3000
(2)-105 <= nums[i] <= 105
解題思路
(1)對輸入的nums中遍歷獲取第一個數,相同時跳過
(2)在第一個數右邊遍歷獲取第二個數,相同時跳過
(3)在右邊開始往回找第三個數,但是要保證第三個數在第二個數右邊
(4)如果找到三個數加起來的和為0,則記錄進ans
(5)最后輸出ans
代碼
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
nums.sort()
ans = list()
# 列舉 a
for first in range(n):
# 需要和上一次列舉的數不相同
if first > 0 and nums[first] == nums[first - 1]:
continue
# c 對應的指標初始指向陣列的最右端
third = n - 1
target = -nums[first]
# 列舉 b
for second in range(first + 1, n):
# 需要和上一次列舉的數不相同
if second > first + 1 and nums[second] == nums[second - 1]:
continue
# 需要保證 b 的指標在 c 的指標的左側
while second < third and nums[second] + nums[third] > target:
third -= 1
# 如果指標重合,隨著 b 后續的增加
# 就不會有滿足 a+b+c=0 并且 b<c 的 c 了,可以退出回圈
if second == third:
break
if nums[second] + nums[third] == target:
ans.append([nums[first], nums[second], nums[third]])
return ans
Reference
題庫 - 力扣 (LeetCode) 全球極客摯愛的技術成長平臺
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301972.html
標籤:python
