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. 火柴拼正方形的主要内容,如果未能解决你的问题,请参考以下文章

473. 火柴拼正方形

473. 火柴拼正方形

leetcode-473 火柴拼正方形

Leetcode刷题Python473. 火柴拼正方形

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

LeetCode 473. 火柴拼正方形