火柴拼正方形
473. 火柴拼正方形 - 力扣(LeetCode)
你将得到一个整数数组 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
解题思路
本体思路同698. 划分为k个相等的子集,采用回溯算法,相当于有4个容量相同的桶,把小球放入这四个桶中,如果所有的小球都能放入这四个桶,说明可以拼成正方形。
如图,站在小球的视觉,每个小球可以放入任意的桶,桶的容量为totalLen/4,每一层代表每个小球的选择,若找到一条能放满小球的路径,返回true,为了减少搜素次数,matchsticks数组进行逆序排序。
代码:
1 |
|
- 时间复杂度:$O(4^n)$,其中 n 是火柴的数目。每根火柴都可以选择放在 4 条边上
- 空间复杂度:$O(n)$,n为递归栈需要的空间
火柴拼正方形
http://example.com/2023/05/15/算法/回溯/16. 火柴拼正方形/