程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> LeetCode 4Sum

LeetCode 4Sum

編輯:關於C++

LeetCode解題之4Sum


原題

找出一個列表中四個元素之和為目標值的情況,打印出所有的情況。

注意點:

四元組中的數字要按增序排列(a<=b<=c) 結果集中沒有重復的四元組

例子:

輸入: nums=[1, 0, -1, 0, -2, 2]
輸出: [[-1, 0, 0, 1], [-2, 0, 0, 2], [-2, -1, 1, 2]]

解題思路

想參照之前的一題3Sum的解法來解決,結果超時了。換個思路,空間換時間。既然有四個數,那就把前兩個數之和和後兩個數之和分別當做一個數。現在要求的就是在一個列表中哪兩個數的和為特定值。可以先遍歷一遍列表,存值和它的下標的鍵值對,第二遍遍歷列表尋找(目標值-當前值)是否在之前的鍵值對中,如果在就是符合的一組解。

AC源碼

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來獲得相關源碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved