216. 组合总和 III
题目
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
my solution
基于上一个组合体的思路,在终止条件处加了一个有关和的条件。
class Solution:
def __init__(self):
self.res=[]
self.path=[]
def backtracking(self,n,k,startindex):
#print(self.res,self.path)
if len(self.path)==k and sum(self.path)==n:
self.res.append(self.path[:])
return
for i in range(startindex,10):
self.path.append(i)
self.backtracking(n,k,i+1)
self.path.pop()
return
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
self.backtracking(n,k,1)
return self.res
改进:
- 每次都从头开始求sum时间开销大
- 两次剪枝操作,减少时间开销。注意第二处是10-不是9-
class Solution:
def __init__(self):
self.res=[]
self.path=[]
def backtracking(self,sum,n,k,startindex):
# 剪枝操作1
if sum>n:return
if len(self.path)==k and sum==n:
self.res.append(self.path[:])
return
for i in range(startindex,10):
# 剪枝操作2:注意这里是10
if i>10-(k-len(self.path)):return
sum+=i
self.path.append(i)
self.backtracking(sum,n,k,i+1)
sum-=i
self.path.pop()
return
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
self.backtracking(0,n,k,1)
return self.res
17电话号码
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
my solution
class Solution:
def __init__(self):
self.digmap=[[],[],['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l'],['m','n','o'],['p','q','r','s'],['t','u','v'],['w','x','y','z']]
self.res=[]
self.path=[]
def backtracking(self,digits,curchrindex):
if len(self.path)==len(digits):
if self.path[:]:self.res.append("".join(self.path[:]))
return
for k1 in self.digmap[int(digits[curchrindex])]:
self.path.append(k1)
self.backtracking(digits,curchrindex+1)
self.path.pop()
return
def letterCombinations(self, digits: str) -> List[str]:
self.backtracking(digits,0)
return self.res
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈我居然有2次ac medium的哈哈哈哈哈铁树开花🪷(铁树️lzx的笨脑壳
时间间隔一分钟 让我得意五分钟xs哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
我在这个行业好像还有救的!