leetcode-473. 火柴拼正方形

KpLn_HJL發表於2020-10-13

題目

還記得童話《賣火柴的小女孩》嗎?現在,你知道小女孩有多少根火柴,請找出一種能使用所有火柴拼成一個正方形的方法。不能折斷火柴,可以把火柴連線起來,並且每根火柴都要用到。

輸入為小女孩擁有火柴的數目,每根火柴用其長度表示。輸出即為是否能用所有的火柴拼成正方形。

示例 1:

輸入: [1,1,2,2,2]
輸出: true

解釋: 能拼成一個邊長為2的正方形,每邊兩根火柴。

示例 2:

輸入: [3,3,3,3,4]
輸出: false

解釋: 不能用所有火柴拼成一個正方形。

注意:

給定的火柴長度和在 0 到 10^9之間。
火柴陣列的長度不超過15。

解題思路

劃分為k個相等的子集思路完全一樣,是k = 4的特例

狀態壓縮dp的思路和這個完全一樣的,只不過是在visited_indexs的地方用bit來表示了。

程式碼

class Solution:
    def makesquare(self, nums: List[int]) -> bool:
        if (not nums) or sum(nums) % 4 or max(nums) > sum(nums) // 4:
            return False
        visited_indexs = [False] * len(nums)
        target = sum(nums) // 4
        def helper(nums: list, edge_cnt: int, begin_index: int, cur_sum: int) -> bool:
            if edge_cnt == 4:
                return True
            if cur_sum > target:
                return False
            if cur_sum == target:
                return helper(nums, edge_cnt + 1, 0, 0)
            for index in range(begin_index, len(nums)):
                if visited_indexs[index]:
                    continue
                visited_indexs[index] = True
                if helper(nums, edge_cnt, index + 1, cur_sum + nums[index]):
                    return True
                visited_indexs[index] = False
            return False
        return helper(nums, 0, 0, 0)

相關文章