Leet Code——三数の和


タイトル
       n        nums,   nums           a,b,c ,   a + b + c = 0 ?                。

  :              。

  ,      nums = [-1, 0, 1, 2, -1, -4],

           :
[
  [-1, 0, 1],
  [-1, -1, 2]
]


python解答
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        #      ,  hash map,        ,    。
        # if len(nums) < 3: return []
        # nums = sorted(nums)
        # res = []
        # for i, x in enumerate(nums[:-2]):
        #     if len(nums) > 4 and x == nums[i-1]:
        #         continue
        #     d = {}
        #     temp = nums[i+1:]
        #     for k,v in enumerate(temp):
        #         if len(temp) > 2 and v == temp[k-1] and v == temp[k-2]:
        #             continue
        #         if v not in d:
        #             d[-x-v] = 1
        #         else:
        #             res.append([x,v,-v-x])
        #             del d[v]
        # return res
        if len(nums) < 3 : return []
        nums.sort()
        res = []
        for i, x in enumerate(nums):
            if i == 0 or nums[i] > nums[i-1]:
                left = i+1
                right = len(nums) - 1
                
                while right > left:
                    s = nums[i] + nums[left] + nums[right]
                    
                    if s == 0:
                        res.append([nums[i], nums[left], nums[right]])
                        left += 1
                        right -= 1
                        
                        while right > left and nums[left] == nums[left -1]:         #   
                            left += 1
                        while right > left and nums[right] == nums[right + 1]:
                            right -= 1
                    elif s > 0:
                        right -= 1
                    else:
                        left += 1
            
        return res

解析
  • は、3層サイクル
  • を用いることができる.
  • の2層サイクルで、3面目の3層目のサイクルを辞書に置き換えるのは、重くなりにくい.
  • 上記の方法に従って、1層の循環+2ポインタの方式で、比較的に重いことを除去します.