Matchsticks to Square

題目來源
給一堆火柴,判斷其能不能圍成一個(gè)正方形。
我實(shí)在是太弱了,這都不會(huì)做。
DFS的方法,四條邊,對(duì)于每個(gè)火柴,取或者不取,當(dāng)四條邊相等并且取完時(shí)候返回true。
中間有三個(gè)優(yōu)化方案:

  1. 可以先求出正方形邊長(zhǎng),然后進(jìn)行剪枝;
  2. 將火柴長(zhǎng)度從大到小排序,對(duì)于false的情況,可以更快的返回,這個(gè)優(yōu)化很大?。。?/li>
  3. 四條邊,當(dāng)前面幾條邊已經(jīng)計(jì)算過當(dāng)前長(zhǎng)度是否可行的時(shí)候,就不需要再計(jì)算了。
    代碼如下:
class Solution {
public:
    bool makesquare(vector<int>& nums) {
        if (nums.size() == 0)
            return false;
        vector<int> sideLength(4, 0);
        sort(nums.begin(), nums.end(), [](const int &l, const int &r) { return l > r; });
        int sum = 0;
        for (auto num : nums)
            sum += num;
        if (sum % 4 != 0)
            return false;
        return dfs(sideLength, nums, 0, sum / 4);
    }
    
    bool dfs(vector<int>& sideLength, vector<int>& nums, int cur, int target)
    {
        if (cur == nums.size())
            return  sideLength == vector<int>(4, sideLength[0]);
        for (int i=0; i<4; i++) {
            if (sideLength[i] + nums[cur] > target)
                continue;
                
            int j = i;
            while (--j >= 0) // third
                if (sideLength[i] == sideLength[j]) 
                    break;
            if (j != -1) continue;
            
            sideLength[i] += nums[cur];
            if (dfs(sideLength, nums, cur+1, target))
                return true;
            sideLength[i] -= nums[cur];
        }
        return false;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容