title: LEETCODE-DAY27
date: 2024-03-18 12:55:19
tags:
今日内容:39. 组合总和、40.组合总和II、131.分割回文串
T1
class Solution:
def backtracking(self,candidates,target,nums,res):
if sum(nums)==target:
res.append(nums.copy())
return
for i in range(len(candidates)):
nums.append(candidates[i])
self.backtracking(candidates,target,nums,res)
nums.pop()
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
res=[]
self.backtracking(candidates,target,[],res)
return res
超出时间限制
class Solution:
def backtracking(self,candidates,target,nums,res):
if sum(nums)==target:
res.append(nums.copy())
return
if sum(nums)> target:
return
for i in range(len(candidates)):
nums.append(candidates[i])
self.backtracking(candidates,target,nums,res)
nums.pop()
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
res=[]
self.backtracking(candidates,target,[],res)
return res
andidates =
[2,3,6,7]
target =
7
输出
[[2,2,3],[2,3,2],[3,2,2],[7]]
预期结果
[[2,2,3],[7]]
有重复
暴力去重
class Solution:
def backtracking(self,candidates,target,nums,res):
if sum(nums)==target:
if sorted(nums.copy()) not in res:
res.append(sorted(nums.copy()))
return
if sum(nums)> target:
return
for i in range(len(candidates)):
nums.append(candidates[i])
self.backtracking(candidates,target,nums,res)
nums.pop()
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
res=[]
self.backtracking(candidates,target,[],res)
return res
更便捷的方法:用index
T2
class Solution:
def backtracking(self,candidates,target,index,nums,res):
if sum(nums)> target:
return
if index==len(candidates):
return
if sum(nums)==target:
if sorted(nums.copy()) not in res:
res.append(sorted(nums.copy()))
return
for i in range(index,len(candidates)):
nums.append(candidates[i])
self.backtracking(candidates,target,index+1,nums,res)
nums.pop()
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
res=[]
self.backtracking(candidates,target,0,[],res)
return res
candidates =
[2,5,2,1,2]
target =
5
输出
[[1,2,2],[1,1,1,2],[5]]
预期结果
[[1,2,2],[5]]
输入
candidates =
[10,1,2,7,6,1,5]
target =
8
输出
[[1,1,6],[1,1,1,5],[1,1,1,1,2,2],[1,2,5],[1,7],[1,1,2,2,2],[2,6]]
预期结果
[[1,1,6],[1,2,5],[1,7],[2,6]]
class Solution:
def backtracking(self,candidates,target,index,nums,res):
if sum(nums)> target:
return
if sum(nums)==target:
if sorted(nums.copy()) not in res:
res.append(sorted(nums.copy()))
return
for i in range(index,len(candidates)):
nums.append(candidates[i])
self.backtracking(candidates,target,i+1,nums,res)
nums.pop()
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
res=[]
self.backtracking(candidates,target,0,[],res)
return res
回溯时参数应为i+1
此时超出时间限制27/176
class Solution:
def backtracking(self,candidates,target,index,nums,res):
if sum(nums)> target:
return
if sum(nums)==target:
if sorted(nums.copy()) not in res:
res.append(sorted(nums.copy()))
return
for i in range(index,len(candidates)):
nums.append(candidates[i])
self.backtracking(candidates,target,i+1,nums,res)
nums.pop()
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
if sum(candidates)<target:
return []
res=[]
self.backtracking(candidates,target,0,[],res)
return res
超出时间限制172/176
直接对candidates排序,这样可以减少排序的次数
class Solution:
def backtracking(self,candidates,target,index,nums,res):
if sum(nums)> target:
return
if sum(nums)==target:
res.append(nums.copy())
return
for i in range(index,len(candidates)):
if candidates[i]==candidates[i-1]:
continue
nums.append(candidates[i])
self.backtracking(candidates,target,i+1,nums,res)
nums.pop()
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
if sum(candidates)<target:
return []
res=[]
candidates.sort()
self.backtracking(candidates,target,0,[],res)
return res
candidates =
[2,5,2,1,2]
target =
5
输出
[[5]]
预期结果
[[1,2,2],[5]]
def backtracking(self,candidates,target,index,nums,res):
if sum(nums)> target:
return
if sum(nums)==target:
res.append(nums.copy())
return
for i in range(index,len(candidates)):
#if candidates[i]==candidates[i-1]:
#continue
nums.append(candidates[i])
self.backtracking(candidates,target,i+1,nums,res)
nums.pop()
输入
candidates =
[10,1,2,7,6,1,5]
target =
8
输出
[[1,1,6],[1,2,5],[1,7],[1,2,5],[1,7],[2,6]]
预期结果
[[1,1,6],[1,2,5],[1,7],[2,6]]
问题在于i=index时多去重了
class Solution:
def backtracking(self,candidates,target,index,nums,res):
if sum(nums)> target:
return
if sum(nums)==target:
res.append(nums.copy())
return
for i in range(index,len(candidates)):
if i>index and candidates[i]==candidates[i-1]:
continue
nums.append(candidates[i])
self.backtracking(candidates,target,i+1,nums,res)
nums.pop()
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
if sum(candidates)<target:
return []
res=[]
candidates.sort()
self.backtracking(candidates,target,0,[],res)
return res
AC
T3
class Solution:
def isPalindrome(self,s):
i=0
j=len(s)-1
while i<=j:
if s[i] !=s[j]:
return False
i+=1
j-=1
return True
def backtracking(self,s,index,path,res):
if index==len(s):
res.append(path)
return
for i in range(index,len(s)):
if self.isPalindrome(s[index:i]):
path+=s[index:i]
self.backtracking(s,i,path,res)
path=path[:-(i-index)]
def partition(self, s: str) -> List[List[str]]:
res=[]
self.backtracking(s,0,[],res)
return res
RecursionError: maximum recursion depth exceeded in comparison
^^^^^^^^^^^^^^^^^^^
for i in range(index,len(s)):
Line 16 in backtracking (Solution.py)
for i in range(index,len(s)):
if self.isPalindrome(s[index:i]):
path.append(s[index:i])
self.backtracking(s,i,path,res)
path.pop()
else:
return
仍错误
class Solution:
def isPalindrome(self,s):
i=0
j=len(s)-1
while i<=j:
if s[i] !=s[j]:
return False
i+=1
j-=1
return True
def backtracking(self,s,index,path,res):
if index==len(s):
res.append(path)
return
for i in range(index,len(s)):
if self.isPalindrome(s[index:i]):
path.append(s[index:i])
else:
continue
self.backtracking(s,i+1,path,res)
def partition(self, s: str) -> List[List[str]]:
res=[]
self.backtracking(s,0,[],res)
return res
输入
s =
“a”
输出
[[“”]]
预期结果
[[“a”]]
输入
s =
“aab”
输出
[[“”,“”,“”,“a”,“a”,“”,“aa”],[“”,“”,“”,“a”,“a”,“”,“aa”],[“”,“”,“”,“a”,“a”,“”,“aa”],[“”,“”,“”,“a”,“a”,“”,“aa”]]
预期结果
[[“a”,“a”,“b”],[“aa”,“b”]]
def backtracking(self,s,index,path,res):
if index==len(s):
res.append(path.copy())
return
for i in range(index,len(s)):
if self.isPalindrome(s[index:i]):
path.append(s[index:i])
self.backtracking(s,i+1,path,res)
path.pop()
输入
s =
“aab”
输出
[[“”,“”,“”],[“”,“a”],[“a”,“”],[“aa”]]
预期结果
[[“a”,“a”,“b”],[“aa”,“b”]]
错误在于出现为空的情况即i=index
故i应改为i+1,这并不会造成下标溢出,因为s[index,len(s)]正好取到s最后一个元素
class Solution:
def isPalindrome(self,s):
i=0
j=len(s)-1
while i<=j:
if s[i] !=s[j]:
return False
i+=1
j-=1
return True
def backtracking(self,s,index,path,res):
if index==len(s):
res.append(path.copy())
return
for i in range(index,len(s)):
if self.isPalindrome(s[index:i+1]):
path.append(s[index:i+1])
self.backtracking(s,i+1,path,res)
path.pop()
def partition(self, s: str) -> List[List[str]]:
res=[]
self.backtracking(s,0,[],res)
return res
AC
文章介绍了在LeetCode题目中,如何通过回溯算法实现组合总和(包括常规版本和去重版本)以及判断字符串是否为回文串。着重讨论了代码优化,如避免重复和处理边界条件,以提高算法效率。
338

被折叠的 条评论
为什么被折叠?



