leetcode473火柴拼正方形

[1,1,2,2,2]
可以拼成一個正方形[1+1,2,2,2]
思想:
	1.木桶法,把四個邊當作四個木桶,從數組大的一端開始裝入木桶,一直裝到avg
	2.回溯,每個數組元素可以裝在木桶裏。也可以不裝在木桶裏讓下一個木桶裝。
bool make_sq(vector<int>& nums,vector<int>& count,int begin,int end,int avg)
    {
        if(begin==end&&count[0]==avg&&count[1]==avg&&count[2]==avg&&count[3]==avg)
            return true;//退出條件
        int i;
        for(i=0;i<4;i++)//路徑選擇
        {
             if(count[i]+nums[end]<=avg)//必須有等號,不然沒法進入下一個木桶的循環,這裏是個剪枝
            {
                count[i]=count[i]+nums[end];//如果當前木桶裝
                if(make_sq(nums,count,begin,end-1,l))
                    return true;
                count[i]=count[i]-nums[end];//如果當前木桶不裝
            }
        }
        return false;
        
    }
    bool makesquare(vector<int>& nums) {
        long long sum=0;
        int len=nums.size(),i;
        if(len<4)
            return false;
        for(i=0;i<len;i++)
            sum=sum+nums[i];
        if(sum%4!=0)
            return false;
        long long l=sum%4;
        sort(nums.begin(),nums.end());
        vector<int> count;
        for(i=0;i<4;i++)
            count.push_back(0);
        return make_sq(nums,count,-1,len-1,sum/4);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章