【leetcode前500】473. 火柴拼正方形

博客探讨了一个使用递归解决四边形边长调整的问题,提出了三个关键优化点:1) 判断总和是否为4的倍数;2) 限制每次边长不超过平均值;3) 避免在已相等边长上加减导致的重复计算。文章通过示例解释了这些优化如何避免无效计算并提高效率。
摘要由CSDN通过智能技术生成

此题递归做是没毛病的,有三个优化的点: 

1)预先判断变长总和,如果不是4的倍数直接pass掉

2)如果总边长为S,那么最终结果应该是每条边都是L/4,递归时要过滤掉能让变长大于这个值的所有情况

3)有一些情况是无需考虑的,例如:

L1=2,L2=2,L3=2,L4=2情况下,新的长度t=1先加到哪条边?实际上加在哪里都可以,但会导致重复,所以我们限定只加在L1上。再次递归时t=1,我们加在L2上,也就是说因为L3和L4已经是相等的了,我们不去破坏,从而造成大量的浪费。

class Solution:

    def makesquare(self, nums: List[int]) -> bool:
        if sum(nums)%4!=0:
            return False

        self.limit=sum(nums)//4
        def dfs(nums, i,arrs):
            #print(c0,c1,c2,c3)
            if i == len(nums):
                return [self.limit]*4==arrs

            if self.ans:
                return
            t=nums[i]
            for j in range(len(arrs)):
                if t+arrs[j]>self.limit:
                    continue
                if j==0 or arrs[j-1]!=arrs[j]:
                    arrs[j]+=t
                    if dfs(nums,i+1,arrs):
                        return True
                    arrs[j]-=t
            return False
        return dfs(nums,0,[0]*4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值