leetcode-473 火柴拼正方形

Posted lazy pig~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-473 火柴拼正方形相关的知识,希望对你有一定的参考价值。

 

 

class Solution {
public:
    bool makesquare(vector<int>& nums) {
        int l=nums.size();
        int sum=0;
        for(int i=0;i<l;i++)
        {
            sum+=nums[i];
        }
        if(sum==0 || (sum/4)*4 !=sum)
        {
            return false;
        }
        vector<int> data;
        for(int i=0;i<4;i++)
        {
           data.push_back(0);
        }  
        return dfs(nums,data,0,sum/4);//可以看成把所有火柴分为四组
    }
    bool dfs(vector<int>& nums,vector<int>& data,int index,int temp)//对每个火柴以此判断,放在哪个组里,然后回溯。
    {
        if(index==nums.size())
        {
            return data[0]==temp && data[1]==temp && data[2]==temp;
        }
        for(int i=0;i<4;i++)
        {
            if(data[i]+nums[index]<=temp)
            {
                data[i]+=nums[index];
                if (dfs(nums,data,index+1,temp))
                {
                    return true;
                }
                data[i]-=nums[index];
            }
        }
        return false;
    }
};

可能是因为复杂度为4的N次幂,复杂度太大了,所以超时了。

加个剪枝,按从大到小排序,然后再处理,可以减少许多计算量。

class Solution {
public:
    bool makesquare(vector<int>& nums) {
        int l=nums.size();
        int sum=0;
        for(int i=0;i<l;i++)
        {
            sum+=nums[i];
        }
        if(sum==0 || (sum/4)*4 !=sum)
        {
            return false;
        }
        vector<int> data;
        for(int i=0;i<4;i++)
        {
           data.push_back(0);
        }  
        sort(nums.rbegin(),nums.rend()); //反向排序 rbegin,rend
       return dfs(nums,data,0,sum/4);
    }
    bool dfs(vector<int>& nums,vector<int>& data,int index,int temp)
    {
        if(index==nums.size())
        {
            return data[0]==temp && data[1]==temp && data[2]==temp;
        }
        for(int i=0;i<4;i++)
        {
            if(data[i]+nums[index]<=temp) //在此处剪枝
            {
                data[i]+=nums[index];
                if (dfs(nums,data,index+1,temp))
                {
                    return true;
                }
                data[i]-=nums[index];
            }
        }
        return false;
    }
};

 

以上是关于leetcode-473 火柴拼正方形的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-473 火柴拼正方形

LeetCode 473. 火柴拼正方形

leetcode 火柴拼正方形 深搜

473. 火柴拼正方形

LeetCode 374 火柴拼正方形[回溯] HERODING的LeetCode之路

#yyds干货盘点# leetcode算法题:火柴拼正方形