zoukankan      html  css  js  c++  java
  • 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;
        }
    };

  • 相关阅读:
    HDU 4714:Tree2cycle 树形DP
    HDU 4679:Terrorist’s destroy 树形DP
    as 和is的区别
    关于父类引用指向子类对象
    C# new的用法
    Mvc中把list从View传入Controller
    Html.TextBoxFor三元判断
    ref 和out的用法以及区别
    c# datatable list 相互转换
    jquery trigger伪造a标签的click事件取代window.open方法
  • 原文地址:https://www.cnblogs.com/libin123/p/13254952.html
Copyright © 2011-2022 走看看