algorithm

473. Matchsticks to Square

식피두 2020. 9. 3. 19:02

https://leetcode.com/problems/matchsticks-to-square/

 

Matchsticks to Square - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

2200ms !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

import collections
from functools import lru_cache

class Solution:
    def makesquare(self, nums: List[int]) -> bool:
        
        if not nums:
            return False
        if len(nums) < 4:
            return False
        
        nsum = sum(nums)
        
        side = int(nsum/4)
        
        nums = sorted(nums, reverse=True)
        
        @lru_cache(maxsize=None)
        def dfs(i, sides) -> bool:
            if i == len(nums):
                return sum(sides) == 0
            for si, side in enumerate(sides):
                if side-nums[i] >= 0:
                    _sides = sides[:si] + tuple([side-nums[i]]) + sides[si+1:]
                    if dfs(i+1, _sides):
                        return True
            return False
        
        return dfs(0, tuple([side]*4))

add pruning

500ms!!!!!!!!!!!!!!!

import collections
from functools import lru_cache

class Solution:
    def makesquare(self, nums: List[int]) -> bool:
        
        if not nums:
            return False
        if len(nums) < 4:
            return False
        
        nsum = sum(nums)
        #[!!!]
        if nsum%4 != 0:
            return False
        
        side = int(nsum/4)
        
        nums = sorted(nums, reverse=True)
        
        @lru_cache(maxsize=None)
        def dfs(i, sides) -> bool:
            if i == len(nums):
                return sum(sides) == 0
            for si, side in enumerate(sides):
                if side-nums[i] >= 0:
                    _sides = sides[:si] + tuple([side-nums[i]]) + sides[si+1:]
                    if dfs(i+1, _sides):
                        return True
            return False
        
        return dfs(0, tuple([side]*4))

32ms ????

property ; unique pairs

class Solution:
    def makesquare(self, nums: List[int]) -> bool:
        
        n = len(nums)
        nums = sorted(nums, reverse=True)
        
        s = sum(nums)
        
        if n < 4:
            return False
        if s % 4 != 0:
            return False
        
        target = s//4
        visited = [0 for i in range(n)]
        
        def dfs(nums, cur, i, target, n):
            if cur == target:
                return True
            for k in range(i+1, n):
                if not visited[k] and nums[k]+cur <= target:
                    visited[k] = True
                    if dfs(nums, cur + nums[k], k, target, n):
                        return True
                    visited[k] = False
            return False
        
        for i in range(n):
            if visited[i]:
                continue
            visited[i] = True
            if not dfs(nums, nums[i], i, target, n):
                return False
            
        return True