题目:
还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到。
输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形
思路
我看到题目,很快就想到了等分k份数组这道题目.
两道题目几乎就是一样的。
首先要对nums逆序排序(非常重要),因为这样回溯更快。优选选择长度大的火柴,很快就能得出火柴被分配到第k个边是否可以。
class Solution:
def makesquare(self, nums: List[int]) -> bool:
if len(nums) < 4:
return False
size, mod = divmod(sum(nums), 4)
if mod != 0:
return False
nums.sort(reverse=True)
n = len(nums)
edges = [0] * 4
def dfs(i):
if i == n:
if len(set(edges)) == 1:
return True
return False
for a in range(4):
if edges[a] + nums[i] <=size:
edges[a] += nums[i]
if dfs(i+1):
return True
edges[a] -= nums[i]
return False
return dfs(0)