Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 340f140

Browse files
author
hj.tian
committed
feat: update day28_416.py
feat: update day28_416.py
1 parent 1469905 commit 340f140

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

‎leetcode75/day28_416.py

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def canPartition(self, nums: List[int]) -> bool:
6+
"""
7+
1 5 11 5
8+
0 T T T F
9+
1 T T T F
10+
2 F F F F
11+
3 F F F F
12+
4 F F F F
13+
5 F T T F
14+
6 F T T F
15+
7 F F F F
16+
8 F F F F
17+
9 F F F F
18+
10 F F F F
19+
11 F F T F
20+
21+
dp[row][col]: 表示前col个元素是否可以构成row这个数字
22+
dp[row][col] = dp[row][col-1] or dp[row-nums[col]][col-1]
23+
状态压缩: col 只与 col-1 有关
24+
dp[row] = dp[row] or dp[row-nums[col]], row 从后往前, 从前往后不行是因为 col 会覆盖 col-1
25+
"""
26+
total = sum(nums)
27+
if total % 2 > 0 or len(nums) <= 1:
28+
return False
29+
target = total // 2
30+
dp = [False for _ in range(target + 1)]
31+
dp[0] = True
32+
if nums[0] <= target:
33+
dp[nums[0]] = True
34+
for col in range(1, len(nums)):
35+
for row in range(target, 0, -1):
36+
dp[row] = dp[row] or (row >= nums[col] and dp[row - nums[col]])
37+
if dp[target] is True:
38+
return True
39+
return False
40+
41+
42+
# class Solution:
43+
# def canPartition(self, nums: List[int]) -> bool:
44+
# """
45+
# 1 5 11 5
46+
# 0 T T T F
47+
# 1 T T T F
48+
# 2 F F F F
49+
# 3 F F F F
50+
# 4 F F F F
51+
# 5 F T T F
52+
# 6 F T T F
53+
# 7 F F F F
54+
# 8 F F F F
55+
# 9 F F F F
56+
# 10 F F F F
57+
# 11 F F T F
58+
59+
# dp[row][col]: 表示前col个元素是否可以构成row这个数字
60+
# dp[row][col] = dp[row][col-1] or dp[row-nums[col]][col-1]
61+
# """
62+
# total = sum(nums)
63+
# if total % 2 > 0 or len(nums) <= 1:
64+
# return False
65+
# target = total // 2
66+
# dp = [[False for _ in nums] for _ in range(total + 1)]
67+
# dp[0][0] = dp[nums[0]][0] = True
68+
# for col in range(1, len(nums)):
69+
# for row in range(target + 1):
70+
# dp[row][col] = dp[row][col - 1] or (row >= nums[col] and dp[row - nums[col]][col - 1])
71+
# if dp[target][col] is True:
72+
# return True
73+
# return False
74+
75+
76+
# class Solution:
77+
# def canPartition(self, nums: List[int]) -> bool:
78+
# """
79+
# (11,0)
80+
# (10,1) (11,1)
81+
# (5,2) (10,2) (6,2) (11,2)
82+
# - (5,3) - (6,3) (0,3) (11,3)
83+
# (0,4)
84+
# 超时的原因在于重复计数子问题 2**N
85+
# 记录 (target, index) 的解避免重复计算
86+
# """
87+
# total = sum(nums)
88+
# if total % 2 > 0 or len(nums) <= 1:
89+
# return False
90+
# memory = dict()
91+
# return self.search(nums, total // 2, 0, memory)
92+
93+
# def search(self, nums: List[int], target: int, index: int, memory: dict) -> bool:
94+
# if target == 0:
95+
# return True
96+
# if target < 0:
97+
# return False
98+
# if index >= len(nums):
99+
# return False
100+
# if memory.get((target, index)) in (True, False):
101+
# return memory[(target, index)]
102+
# got = self.search(nums, target - nums[index], index + 1, memory)
103+
# memory[(target - nums[index], index + 1)] = got
104+
# not_got = self.search(nums, target, index + 1, memory)
105+
# memory[(target, index + 1)] = not_got
106+
# return got or not_got
107+
108+
109+
# class Solution:
110+
# def canPartition(self, nums: List[int]) -> bool:
111+
# # 暴力搜索 Timeout
112+
# total = sum(nums)
113+
# if total % 2 > 0 or len(nums) <= 1:
114+
# return False
115+
# nums.sort()
116+
# return self.search(nums, total // 2, 0)
117+
118+
# def search(self, nums: List[int], target: int, index: int):
119+
# if target == 0:
120+
# return True
121+
# if target < 0:
122+
# return False
123+
# if index >= len(nums):
124+
# return False
125+
# return self.search(nums, target - nums[index], index + 1) or self.search(nums, target, index + 1)
126+
127+
128+
if __name__ == "__main__":
129+
# assert Solution().canPartition(nums=[1, 5, 11, 5]) is True
130+
# assert Solution().canPartition(nums=[1, 2, 3, 5]) is False
131+
# assert Solution().canPartition(nums=[9, 5]) is False
132+
assert Solution().canPartition(nums=[14, 9, 8, 4, 3, 2]) is True

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /