刷题 9/16

组数总和

链接:题目链接

题目描述

给定一个无重复元素的数组 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
# 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值