給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復的三元組。
注意:答案中不可以包含重復的三元組。
例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4], 滿足要求的三元組集合為: [ [-1, 0, 1], [-1, -1, 2] ]
class Solution(object): def threeSum(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ # 存儲結果列表 res_list = [] # 對nums列表進行排序,無返回值,排序直接改變nums順序 nums.sort() for i in range(len(nums)): # 如果排序后第一個數都大於0,則跳出循環,不可能有為0的三數之和 if nums[i] > 0: break # 排序后相鄰兩數如果相等,則跳出當前循環繼續下一次循環,相同的數只需要計算一次 if i > 0 and nums[i] == nums[i-1]: continue # 記錄i的下一個位置 j = i + 1 # 最后一個元素的位置 k = len(nums) - 1 while j < k: # 判斷三數之和是否為0 if nums[j] + nums[k] == -nums[i]: # 把結果加入數組中 res_list.append([nums[i], nums[j], nums[k]]) # 判斷j相鄰元素是否相等,有的話跳過這個 while j < k and nums[j] == nums[j+1]: j += 1 # 判斷后面k的相鄰元素是否相等,是的話跳過 while j < k and nums[k] == nums[k-1]: k -= 1 # 沒有相等則j+1,k-1,縮小范圍 j += 1 k -= 1 # 小於-nums[i]的話還能往后取 elif nums[j] + nums[k] < -nums[i]: j += 1 else: k -= 1 return res_list if __name__ == '__main__': s = Solution() result_list = s.threeSum([-1, 0, 1, 2, -1, -4]) print(result_list)
