Leetcode刷题Python473. 火柴拼正方形

Posted Better Bench

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题Python473. 火柴拼正方形相关的知识,希望对你有一定的参考价值。

1 题目

你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。
如果你能使这个正方形,则返回 true ,否则返回 false 。

示例 1:

输入: matchsticks = [1,1,2,2,2]
输出: true
解释: 能拼成一个边长为2的正方形,每边两根火柴。

示例 2:

输入: matchsticks = [3,3,3,3,4]
输出: false
解释: 不能用所有火柴拼成一个正方形。

2 解析

回溯方法:
首先计算所有火柴的总长度totalLen,如果 totalLen 不是 4 的倍数,那么不可能拼成正方形,返回false。当 totalLen 是 4 的倍数时,每条边的边长为len = totalLen//4 ,用 edges 来记录 44条边已经放入的火柴总长度。对于第index 火柴,尝试把它放入其中一条边内且满足放入后该边的火柴总长度不超过len ,然后继续枚举第 index+1 根火柴的放置情况,如果所有火柴都已经被放置,那么说明可以拼成正方形。

为了减少搜索量,需要对火柴长度从大到小进行排序。

3 Python实现

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):
            # 判断是否可以继续添加火柴
                if edges[i]+matchsticks[idx] <= (total//4):
                # 如果两个边长不一样,就继续添加火柴
                    if i ==0 or edges[i] !=edges[i-1]:
                        edges[i] += matchsticks[idx]
                        if dfs(idx+1):
                            return True
                        # 回溯
                        edges[i] -= matchsticks[idx]
            return False 
        return dfs(0)

以上是关于Leetcode刷题Python473. 火柴拼正方形的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 473.火柴拼正方形

leetcode-473 火柴拼正方形

LeetCode 473. 火柴拼正方形

473. 火柴拼正方形

473. 火柴拼正方形

力扣中473 火柴拼正方形 题解看不懂 没写出来++*