leetcode-最小路径和、括号生成

最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。

思路:动态规划的思想,计算出每一步所需要的代价,那么第一横排和第一列只能单向的走,代价进行简单的累加即可,剩下的数据为该位置的数据加上上面或者左侧的数据,取最小值即可,最后返回最后一个数据即可。

class Solution(object):
    def minPathSum(self, grid):
        height = len(grid)
        wide = len(grid[0])
        dp = [[0] * wide for _ in range(height)]  # 创建一个横列和给的列表相等的列表
        dp[0][0] = grid[0][0]             # 将第一个数据加到新的列表中
        if not grid or not grid[0]:    
            return 0
        for i in range(1, wide):     # 对第1横排数据进行替换,每一个数据代价等于前面的累加
            dp[0][i] += grid[0][i] + dp[0][i - 1]
        for m in range(1, height):    # 对第1列数据进行替换,每一个数据代价等于前面的累加
            dp[m][0] += grid[m][0] + dp[m - 1][0]
​
        for i in range(1, wide):  
            for m in range(1, height):   # 其他数据取(上面或者左边)最小值+该位置本该有的数据
                dp[m][i] = min(dp[m][i - 1], dp[m - 1][i])+grid[m][i]
        return dp[height-1][wide-1]       # 直接返回右下角的数据

括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]

服了,遇到这种回溯法,递归的就做不来。。。。copy了大佬的答案

思路:递归的思想,当()的长度小于2n的时候不断的进行递归,每一次,+(或者+),直到最后长度等于2n

class Solution(object):
    def generateParenthesis(self, n):
        res = []    # 用于存放数据
​
        def func(s, left, right):   
            if left == right == n:   # 返回的条件,左右括号等于n
                res.append(s)
                return
            elif right <= left <= n:   # 当left大于right但是小于n时,一定还有符合条件的存在
                func(s + ')', left, right + 1)  # 加)括号,左边的计数+1
                func(s + '(', left + 1, right)   # 加(括号,右边的计数+1
​
        func('', 0, 0)   # 传入原始的数据
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值