此题递归做是没毛病的,有三个优化的点:
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)