找出一個列表中四個元素之和為目標值的情況,打印出所有的情況。
注意點:
四元組中的數字要按增序排列(a<=b<=c) 結果集中沒有重復的四元組例子:
輸入: nums=[1, 0, -1, 0, -2, 2]
輸出: [[-1, 0, 0, 1], [-2, 0, 0, 2], [-2, -1, 1, 2]]
想參照之前的一題3Sum的解法來解決,結果超時了。換個思路,空間換時間。既然有四個數,那就把前兩個數之和和後兩個數之和分別當做一個數。現在要求的就是在一個列表中哪兩個數的和為特定值。可以先遍歷一遍列表,存值和它的下標的鍵值對,第二遍遍歷列表尋找(目標值-當前值)是否在之前的鍵值對中,如果在就是符合的一組解。
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
if len(nums) < 4:
return []
result = set()
sumsIndexes = {}
# Get all two elements' sum and indexes map
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] in sumsIndexes:
sumsIndexes[nums[i] + nums[j]].append((i, j))
else:
sumsIndexes[nums[i] + nums[j]] = [(i, j)]
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
sumNeeded = target - (nums[i] + nums[j])
if sumNeeded in sumsIndexes:
for index in sumsIndexes[sumNeeded]:
# Ingore repeating results
if index[0] > j:
result.add(tuple(sorted([nums[i], nums[j], nums[index[0]], nums[index[1]]])))
# Format result with list[list] pattern
result = [list(l) for l in result]
return result
if __name__ == "__main__":
assert Solution().fourSum([1, 0, -1, 0, -2, 2], 0) == [[-1, 0, 0, 1], [-2, 0, 0, 2], [-2, -1, 1, 2]]
歡迎查看我的Github來獲得相關源碼。