给定一个包含非负整数的 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