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;
    }
};

原文地址:https://www.cnblogs.com/libin123/p/13254952.html