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

  • 相关阅读:
    ionic localstorage
    angular 中文鏈接
    把jqmobi 變成jQuery 的插件 從此使用jQuery
    jqmobi 的一些設置
    ionic ngcordova map 地圖
    ionic pull to refresh 下拉更新頁面
    json 對象的序列化
    鍵盤彈出,頁面佈局被推上去了.....
    Cordova V3.0.0中config.xml配置文件的iOS Configuration
    android ios 只能輸入數字 不能輸入小數點的 函數 cordova
  • 原文地址:https://www.cnblogs.com/libin123/p/13254952.html
Copyright © 2011-2022 走看看