组数总和
链接:题目链接
题目描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
解题思路—回溯
我们可以定义一个闭包函数,然后参数是这次递归的数组下标,结果,还有就是target剩下的,如果当前的remain==0,那就可以直接返回这一个结果了,如果< 的话,继续进行下一次递归,如果>,直接return None,因为继续递归下去的只会更大,更不符合要求,因为我们的数组有经过预排序,之所以用下标的话是因为可以防止重复的判断
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
res = []
def find(s,use,remain):
for i in range(s,len(candidates)):
c = candidates[i]
if c == remain:
res.append(use+[c])
if c < remain:
find(i,use+[c],remain-c)
if c > remain:
return
find(0,[],target)
return res
有效的括号
链接:题目链接
题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
解题思路—通过辅助栈
通过设定一个辅助栈,这个辅助栈要先加一个不是括号的字符串进去,防止输入’]'这种非法的情况发生,再定义一个字典就行了,每次如果是左括号就加入辅助栈,右括号的话就把辅助栈的最后一个元素取出来根据字典来取值看看是否相等,不相等的话可以提前就return False了
代码实现
class Solution:
def isValid(self, s: str) -> bool:
dic = {'[':']','{':'}','(':')','?':'?'}
# 提前加一个字符是防止输入为')'这种情况
stack = ['?']
for c in s:
if c in dic:
stack.append(c)
elif dic[stack.pop()] != c:
return False
return len(stack) == 1
#