IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Divide and Conquer solution for LeetCode #494

    RobinDong发表于 2023-02-09 23:48:16
    love 0

    The popular solution for LeetCode #494 is dynamic programming. But my first idea is Divide and Conquer. Although it’s not very fast, it’s another idea:

    from collections import Counter
    
    class Solution:
        def get_results(self, nums: List[int]) -> Counter:
            layer = [nums[0], -nums[0]]
            for num in nums[1:]:
                new_layer = []
                for item in layer:
                    for val in [-num, num]:
                        new_layer.append(item + val)
                layer = new_layer
            return Counter(layer)
        
        def findTargetSumWays(self, nums: List[int], target: int) -> int:
            n = len(nums)
            if n == 1:
                return [0, 1][nums[0] == target or -nums[0] == target]
            half = n // 2
            left = self.get_results(nums[:half])
            right = self.get_results(nums[half:])
            ans = 0
            for lkey, lcnt in left.items():
                rcnt = right[target - lkey]
                ans += rcnt * lcnt
            return ans


沪ICP备19023445号-2号
友情链接