问题:本站对该题的题解方法,c++下可ac, 用python测试结果TLE, 过不了倒数第二个testcase。
详情: 我用了不同于题解方法ac后,看到题解很简洁,便照用python照写了一个测速度,结果TLE。而且很困惑的是我ac的这个方法应该在遍历深度和剪枝方面都和题解差不多,但就不知为什么题解的方法会TLE。(我的方法是先找到几个数能凑成一条边,mark一下这几个数保证下一层dfs不能用了,继续dfs到下一层,直至找到4条边或遍历结束。题解方法在这,题解代码用回cpp提交是可以ac的,不过速度也是28%左右)。已经看了几百遍code了,照搬的部分应该是没错的,下面附了照搬题解的code和我自己的code,求大佬解惑。
照搬的code (TLE):
class Solution:
def makesquare(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
if len(nums) == 0: return False
perimeter = sum(nums)
side = perimeter // 4
if side * 4 != perimeter:
return False
nums = sorted(nums, reverse = True)
def dfs(nums, s, side , index):
if s[0] == s[1] == s[2] == side: return True
for i in range(4):
if s[i] + nums[index] > side: continue
s[i] += nums[index]
if dfs(nums, s, side, index+1): return True
s[i] -= nums[index]
return False
return dfs(nums, [0,0,0,0], side, 0)
我的code:
class Solution:
def makesquare(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
if nums == []: return False
s = sum(nums)
if s % 4 != 0: return False
side = s // 4
n = 4
nums = sorted(nums, reverse = True)
def dfs(target, nums, last, count):
if target == 0:
count += 1
print(nums, count,target)
if count == 4:
return True
else:
if dfs(side, nums, 0, count): return True
return False
for i in range(last, len(nums)):
if not nums[i]: continue
if nums[i] > target: continue
temp = nums[i]
nums[i] = None
if dfs(target-temp, nums, i, count): return True
nums[i] = temp
if dfs(side, nums, 0, 0):
return True
else:
return False
题解, dfs, complexity, TLE
提问于2018-07-18 00:10
22656