[leetcode] 473. Matchsticks to Square

本文探讨了如何使用特定长度的火柴拼接成一个正方形的问题,通过详细的算法解释和代码示例,展示了如何判断给定火柴是否能构成正方形,包括火柴长度的累积计算、排序优化及回溯搜索策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

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:
The length sum of the given matchsticks is in the range of 0 to 10^9.
The length of the given matchstick array will not exceed 15.

分析

题目的意思是:给你一些火柴,火柴有长度,看能否用这些火柴拼成一个正方形。

  • 建立一个长度为4的数组sums来保存每个边的长度和,我们希望每条边都等于target,数组总和的四分之一。然后我们遍历sums中的每条边,我们判断如果加上数组中的当前数字大于target,那么我们跳过,如果没有,我们就加上这个数字,然后对数组中下一个位置调用递归,如果返回为真,我们返回true,否则我们再从sums中对应位置将这个数字减去继续循环.

代码

class Solution {
public:
    bool makesquare(vector<int>& nums) {
        if(nums.empty()||nums.size()<4) return false;
        int sum=accumulate(nums.begin(),nums.end(),0);
        if(sum%4!=0) return false;
        vector<int> sums(4,0);
        sort(nums.rbegin(),nums.rend());
        return solve(nums,sum/4,0,sums);
    }
    bool solve(vector<int>& nums,int target,int pos,vector<int>& sums){
        if(pos>=nums.size()){
            return (sums[0]==target&&sums[1]==target&&sums[2]==target);
        }
        for(int i=0;i<4;i++){
            if(sums[i]+nums[pos]>target) continue;
            sums[i]+=nums[pos];
            if(solve(nums,target,pos+1,sums)) return true;
            sums[i]-=nums[pos];
        }
        return false;
    }
};

参考文献

[LeetCode] Matchsticks to Square 火柴棍组成正方形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值