题目描述[原题链接][https://leetcode-cn.com/problems/matchsticks-to-square/]
还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到。
输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形。
示例 1:
1 | 输入: [1,1,2,2,2] |
示例 2:
1 | 输入: [3,3,3,3,4] |
注意:
- 给定的火柴长度和在
0
到10^9
之间。 - 火柴数组的长度不超过15。
算法描述
这一题首先是判断数组和是不是4的倍数,如果不是的话,那一定不能拼成正方形。
然后,遍历一遍数组,若有一个数大于数组和/4,那么也一定不能拼成正方形。
接着就要用回溯来判断了,这题的回溯指的是,把火柴放进不同的边里去。
因此相当于,对于任意一根火柴,将火柴放入大小为4的数组某一维度中去。
直到全部的火柴处理完,在处理过程中,如果某一个边的大小已经超过数组和/4,那就
剪枝,因为这样是不可能组成正方形的。
这里的贪心在于,如果从大到小处理,那么速度将会快的很多。因此在回溯之前,先给数组排序。
C++代码
1 | class Solution { |
Java代码
1 | class Solution { |