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

  • 相关阅读:
    windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法(转载)
    大前端涉猎之前后端交互总结3:使用PHP进行表单数据删除与查询
    异常处理
    java 触发鼠标点击事件 向linux发送指令
    反射机制
    静态方法,类方法,属性方法
    python 类
    python 正则表达式
    python 加密模块
    python xml 与配置文件处理
  • 原文地址:https://www.cnblogs.com/libin123/p/13254952.html
Copyright © 2011-2022 走看看