473. 火柴拼正方形
Posted 不吐西瓜籽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了473. 火柴拼正方形相关的知识,希望对你有一定的参考价值。
算法记录
LeetCode 题目:
还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。
说明
一、题目
还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。
二、分析
- 能围成正方形也就意味着总和肯定是
4
的整数倍, 这里可以先进行一次逻辑上的剪枝. - 四个方向抽象为四个桶, 只需要往其中进行数据的添加判断是否能刚好塞进去
1 / 4
的值即可. - 注意回退的时候需要将之前添加到当前桶中的数据拿出去, 不然影响整个数据的和.
- 添加几次边界判断剪枝可以提高算法的执行效率.
class Solution {
public boolean makesquare(int[] matchsticks) {
Arrays.sort(matchsticks);
int nums = 0;
int[] ans = new int[4];
for(int i : matchsticks) nums += i;
if(nums % 4 != 0) return false;
for(int i = 0; i < 4; i++) ans[i] = nums / 4;
return dfs(ans, matchsticks, matchsticks.length - 1);
}
private boolean dfs(int[] ans, int[] matchsticks, int index) {
if(index == -1) return true;
for(int i = 0; i < 4; i++) {
if(ans[i] < matchsticks[index]) continue;
if(ans[i] == matchsticks[index] || ans[i] - matchsticks[index] >= matchsticks[0]) {
ans[i] -= matchsticks[index];
if(dfs(ans, matchsticks, index - 1)) return true;
ans[i] += matchsticks[index];
}
}
return false;
}
}
总结
熟悉深度优先遍历的方法。
以上是关于473. 火柴拼正方形的主要内容,如果未能解决你的问题,请参考以下文章