leetcode--三數之和(python實現雙指標法)

Alfred king發表於2020-10-21

題目描述:

給你一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組

例子:

給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:
[
  [-1, 0, 1],
  [-1, -1, 2]
]


思路分析:本題目與之前的兩數之和相似,但是如果用暴力解決的辦法,時間複雜度為O(N^3)而且在leetcode中容易超時,因此本題採用雙指標法。

首先先排除一下特例的情況如陣列的元素長度小於3或者空陣列,在接著對陣列進行排序,如果最小的元素都大於0,不存在三數之和為0。我們將左指標設為i+1,右指標len(nums)-1,如果存在三數之和為0,則左右指標各向右移動,接著需要判斷該數的附近是否有重複,進行去重,各自指標進行移動。如果三數之和大於0,右指標左移,左指標右移。

程式碼展示


class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        #雙指標法
        n=len(nums)
        ans=[]
        if n<3 or nums==None:
            return []
        ans=[]
        nums.sort()
        for i in range(n):
            if nums[i]>0:
                return ans
            if i>0 and nums[i]==nums[i-1]:
                continue
            L=i+1
            R=n-1
            while L<R:
                if nums[i]+nums[L]+nums[R]==0:
                    ans.append([nums[i],nums[L],nums[R]])#新增符合要求的元素
                    while(L<R and nums[L]==nums[L+1]):#判斷左指標附近有無重複元素
                        L=L+1
                    while(L<R and nums[R]==nums[R-1]):
                        R=R-1
                    L=L+1
                    R=R-1#右指標往左移動
                elif nums[i]+nums[L]+nums[R]>0:
                    R=R-1
                else:
                    L=L+1
        return ans

相關文章