Leetcode 4sum

Leetcode 4sum

在这里插入图片描述
初始思路想基于3sum写4sum 复杂度是 o ( N 3 ) o(N^3) o(N3),于是尝试有没有更简单的算法

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        sum_l={}
        for i in range(len(nums)):                                #[1]
            for j in range(i+1,len(nums)):
                sum_label=nums[i]+nums[j]
                if sum_label not in sum_l:
                    sum_l[sum_label]=[]
                sum_l[sum_label].append([i, j])
        answer=set()
        dict_42={}
        fanswer=list()
        for a in sum_l:                                           #[2]
            if a not in dict_42:                                  #此处先做不在词典的判断,可以把a=target/2的特殊情况考虑进去,而不需要加判断
                dict_42[target-a]=sum_l[a]
            if a in dict_42:
                for aff1 in range(len(sum_l[a])):                 #[3]
                    for aff2 in range(len(dict_42[a])):
                        a1,a2 = sum_l[a][aff1]
                        b1,b2 = dict_42[a][aff2]
                        items =set([a1,a2,b1,b2])
                        if len(items)==4 :                        #这个地方先使用set,可以把相同元素去掉,set的元素可以是tuple的,但不能是list的,因为list是unhashable的
                            newItem=[nums[fi] for fi in items]
                            newItem=tuple(sorted(newItem))
                            answer.add(newItem);

        for a in answer:                                          #转化成list输出
            aff=[i for i in a]
            fanswer.append(aff)
        return fanswer
             

算法中[1],[2]处循环是 o ( N 2 ) o(N^2) o(N2)的,在2处是 o ( N 2 ) o(N^2) o(N2)时,3处两个循环都是 o ( 1 ) o(1) o(1)的,所以整体是 o ( N 2 ) o(N^2) o(N2)
极端情况下[2]处循环是 o ( 1 ) o(1) o(1)时,[3]处两循环可能都是 o ( N 2 ) o(N^2) o(N2)的,所以整体式 o ( N 4 ) o(N^4) o(N4)的,同理[2]处是 o ( N ) o(N) o(N)时,整体有可能是 o ( N 3 ) o(N^3) o(N3)的,但是在更一般的情况下,该算法有更好的复杂度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值