# 【LeetCode】473. Matchsticks to Square 解题报告（Python & C++）

1033 篇文章 59 订阅
900 篇文章 170 订阅

id： fuxuemingzhu

## 题目描述

Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match girl has, please find out a way you can make one square by using up all those matchsticks. You should not break any stick, but you can link them up, and each matchstick must be used exactly one time.

Your input will be several matchsticks the girl has, represented with their stick length. Your output will either be true or false, to represent whether you could make one square using all the matchsticks the little match girl has.

Example 1:

Input: [1,1,2,2,2]
Output: true

Explanation: You can form a square with length 2, one side of the square came two sticks with length 1.

Example 2:

Input: [3,3,3,3,4]
Output: false

Explanation: You cannot find a way to form a square with all the matchsticks.

Note:

1. The length sum of the given matchsticks is in the range of 0 to 10^9.
2. The length of the given matchstick array will not exceed 15.

## 解题方法

### 回溯法

Python代码：

class Solution:
def makesquare(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
if not nums or len(nums) < 4: return False
_sum = sum(nums)
div, mod = divmod(_sum, 4)
if mod != 0 or max(nums) > _sum / 4: return False
nums.sort(reverse = True)
target = [div] * 4
return self.dfs(nums, 0, target)

def dfs(self, nums, index, target):
if index == len(nums): return True
num = nums[index]
for i in range(4):
if target[i] >= num:
target[i] -= num
if self.dfs(nums, index + 1, target): return True
target[i] += num
return False

C++代码如下：

class Solution {
public:
bool makesquare(vector<int>& nums) {
if (nums.size() < 4) return false;
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum % 4 != 0)
return false;
int edge = sum / 4;
vector<int> target(4, edge);
return helper(nums, 0, target);
}
bool helper(vector<int>& nums, int index, vector<int>& target) {
const int N = nums.size();
if (index == N) return true;
int num = nums[index];
for (int i = 0; i < 4; ++i) {
if (target[i] >= num) {
target[i] -= num;
if (helper(nums, index + 1, target))
return true;
target[i] += num;
}
}
return false;
}
};

## 日期

2018 年 4 月 2 日 —— 要开始准备ACM了
2019 年 2 月 23 日 —— 没时间了

• 1
点赞
• 0
收藏 更改收藏夹
• 打赏
• 0
评论
05-12 181
12-10 520
06-01 295
07-31 51
02-21 287
11-22 251
06-01 72
12-26 1366

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。