题目
473. 火柴拼正方形
你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。
如果你能使这个正方形,则返回 true ,否则返回 false 。
示例 1:
输入: matchsticks = [1,1,2,2,2] 输出: true 解释: 能拼成一个边长为2的正方形,每边两根火柴。
示例 2: 输入: matchsticks = [3,3,3,3,4] 输出: false 解释: 不能用所有火柴拼成一个正方形。
提示:
- 1 <= matchsticks.length <= 15
- 1 <= matchsticks[i] <= 108
解题思路
- 首先计算数组的总和,如果总和不是4的倍数,就返回false;否则,正方形的边长为总和除以4的结果,然后依次枚举数组的数值判断是否可以构成正方形。
Code
class Solution:
def makesquare(self, matchsticks: List[int]) -> bool:
total = sum(matchsticks)
if total % 4: return False
matchsticks.sort(reverse=True) # 从大到小进行排序
edges = [0] * 4
def dfs(idx):
if idx == len(matchsticks):
return True
for i in range(4):
edges[i] += matchsticks[idx]
if edges[i] <= total // 4 and dfs(idx + 1):
return True
edges[i] -= matchsticks[idx]
return False
return dfs(0)