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

  • 相关阅读:
    字符串匹配算法的比较(BF算法/KMP算法/jdk自带的indexOf方法)
    重装Python(pip,anaconda,jupyter notebook)
    Python:词频统计及排序
    python压制警告
    StanfordCoreNLP的简单使用
    最常用的几个DOS命令
    (用大白话讲)为什么我们需要配置环境变量
    通配符 vs 正则表达式
    大白话<组件、控件、插件>三者的区别
    R语言:集合运算
  • 原文地址:https://www.cnblogs.com/libin123/p/13254952.html
Copyright © 2011-2022 走看看