动态规划
BlackMan_阿伟
不积跬步无以至千里
展开
-
June——401、二进制手表
class Solution: def readBinaryWatch(self, num: int) -> List[str]: if num>8: return [] res = list() for h in range(12): for m in range(60): #只要分时和秒之和为num即可 if bin(h)..原创 2021-06-21 15:35:56 · 143 阅读 · 0 评论 -
May——剑指 Offer 14- I. 剪绳子I,II
class Solution: def cuttingRope(self, n: int) -> int: #尽可能多的3组成,3越大积越大 if n<3: return 1 if n==3: return 2 res = 1 while n>4: n-=3 res*=3 return res*n ...原创 2021-05-25 10:38:41 · 80 阅读 · 0 评论 -
May——1720.解码亦或后的数组
class Solution: def decode(self, encoded: List[int], first: int) -> List[int]: res = [first] for num in encoded: x = first^num res.append(x) first = x return res题目分析考察了异或运算...原创 2021-05-06 15:57:39 · 60 阅读 · 0 评论 -
April——377.组合综合IV
class Solution: def combinationSum4(self, nums: List[int], target: int) -> int: #dp[i]代表当target为i的时候组合个数 #假如是5 #4的组合数+1 #3的组合数+2 #2的组合数+3 #1的组合数+4 dp = [0]*(target+1) ...原创 2021-04-24 22:21:19 · 138 阅读 · 0 评论 -
April——91.解码方法
class Solution: def numDecodings(self, s: str) -> int: size = len(s) # dp = [0]*(size+1) # dp[0] = 1 # #其实就是爬台阶的问题 # #最后一个字符的解码总数f(n)=f(n-1)+f(n-2) # #f(n-2)需要满足条件,十位数不能是0,后面两位必须小于26才可以 ...原创 2021-04-21 10:34:24 · 178 阅读 · 0 评论 -
March——322.零钱兑换I,II(背包问题)
class Solution: def coinChange(self, coins: List[int], amount: int) -> int: #dp[i]表示金额为i需要最少的硬币 #自顶向下 #dp[i] = min[dp[i-coin1],dp[i-coin2],dp[i-coin3]]+1 #在functools这个模块中,有lru_cache这个一个神奇的装饰器存在。 #functoo...原创 2021-03-09 11:13:08 · 105 阅读 · 0 评论 -
March——354. 俄罗斯套娃信封问题
class Solution: def maxEnvelopes(self, envelopes: List[List[int]]) -> int: # dp = [1]*len(envelopes) # if not envelopes: # return 0 #超出时间限制 # envelopes = sorted(envelopes,key = lambda x:x[0]) ...原创 2021-03-04 17:29:02 · 99 阅读 · 1 评论 -
March——303. 区域和检索 - 数组不可变(304)
一维矩阵前缀和class NumArray: def __init__(self, nums: List[int]): if not nums: return self.nums = nums self.dp = [0]*(len(nums)+1) #前缀和 for i in range(0,len(nums)): self.dp[i+...原创 2021-03-01 11:43:52 · 93 阅读 · 0 评论 -
February——978. 最长湍流子数组
class Solution: def maxTurbulenceSize(self, arr: List[int]) -> int: #动态规划 #以arr[i]结尾,且arr[i]>arr[i-1] increase=[0]*len(arr) #以arr[i]结尾,且arr[i]<arr[i-1] decrease=[0]*len(arr) #初始化的长度都...原创 2021-02-09 10:12:55 · 107 阅读 · 0 评论 -
《Leetcode》152.乘积最大子数组
给你一个整数数组nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。例1输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。例2输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。思路:如果这个数组都是正数或者说负数的个数都是奇数的话,那么整个数组的乘积就是最大的了。所以问题的关键在于负数,如果遇见负数怎么办。初始话两个值,这两个值是数组遍历到这块..原创 2020-05-18 16:12:36 · 122 阅读 · 0 评论 -
February——53.最大子序和
思路:一开始我想的是用滑窗法,但是看了解析之后感觉动态规划更清晰一点。如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字;如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字;每次比较 sum 和 ans的大小,将最大值置为ans,遍历结束返回结果。class Solution: ...原创 2020-05-03 23:35:58 · 93 阅读 · 0 评论 -
February——343.整数拆分
class Solution: def integerBreak(self, n: int) -> int: #数学方法,尽可能拆分成3的乘积 res = 1 if n<4: return n-2 while n>4: n-=3 res*=3 return res*n ...原创 2021-02-05 16:44:11 · 152 阅读 · 0 评论 -
LeetCode——494.目标和
class Solution: def findTargetSumWays(self, nums: List[int], S: int) -> int: if not nums: return 0 #超时了 # count = 0 # def huisu(nums,index,res,S): # nonlocal count # if index=...原创 2021-01-29 11:14:07 · 82 阅读 · 0 评论 -
《Leetcode of December》85.最大矩形
class Solution: def maximalRectangle(self, matrix: List[List[str]]) -> int: if not matrix or not matrix[0]: return 0 #计算有几个连续的1 def getWidth(num): count = 0 while num>0: ...原创 2020-12-26 21:34:34 · 64 阅读 · 0 评论 -
《Leetcode of December》121. 买卖股票的最佳时机
class Solution: def maxProfit(self, prices: List[int]) -> int: n = len(prices) if n == 0: return 0 # 边界条件 dp = [0] * n minprice = prices[0] for i in range(1, n): #更新最小价格 minprice =...原创 2020-12-22 11:36:34 · 67 阅读 · 0 评论 -
《Leetcode of December》746. 使用最小花费爬楼梯
class Solution: def minCostClimbingStairs(self, cost: List[int]) -> int: if not cost: return 0 if len(cost)<3: return cost[0] dp=[0]*len(cost) dp[0]=cost[0] dp[1]=cost[1] ...原创 2020-12-21 10:38:00 · 62 阅读 · 0 评论 -
《Leetcode of December》376.摆动序列
class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: if len(nums)<2: return len(nums) down,up=1,1 #down:下降摆动序列:序列是摆动序列且最后一个元素是小于前一个元素的 #up:上升摆动序列:序列是摆动序列且最后一个元素是大于前一个元素的 ...原创 2020-12-12 10:27:57 · 88 阅读 · 0 评论 -
《Leetcode of December》62. 不同路径
class Solution: def uniquePaths(self, m: int, n: int) -> int: if m==0 or n==0: return 0 #组合数学 return comb(m + n - 2, n - 1) #动态规划 dp=[[0 for _ in range(n)] for _ in range(m...原创 2020-12-09 10:08:10 · 81 阅读 · 0 评论 -
《Leetcode of November》122.买股票的最佳时机II(动态规划)
class Solution: def maxProfit(self, prices: List[int]) -> int: result = 0 dp = [[0,0] for _ in range(len(prices))] dp[0][0]=0 dp[0][1]=-prices[0] #dp[0][0]表示当天交易完成没有股票 # case1:前天也没有股票 # ca...原创 2020-11-09 21:30:07 · 89 阅读 · 0 评论 -
《Leetcode of September 》486.预测赢家
9月开始了,继续加油。题目链接:486.预测赢家class Solution: def PredictTheWinner(self, nums: List[int]) -> bool: #递归 def helper(left, right): #如果左右两个指针重合那就返回当前数 if left == right: return nums[lef原创 2020-09-01 20:42:45 · 91 阅读 · 0 评论 -
动态规划之:打家劫舍II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例1:输入: [2,3,2]输出: 3解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。示例 2.原创 2020-08-05 11:33:48 · 115 阅读 · 0 评论 -
动态规划之:198.打家劫舍I
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入.原创 2020-08-05 10:39:48 · 140 阅读 · 0 评论 -
动态规划:343.整数拆分
给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 ×3 ×4 = 36。1、题目分析拿到题目一看,肯定是动态规划的思想。分为两种情况:将i拆成j和i-j。将j固定,然后分类讨论(i-j);如果i-j是不可再分的:dp[i] = j*(i-j),如果(i-j)还...原创 2020-07-30 21:27:39 · 159 阅读 · 0 评论 -
动态规划:剑指 Offer 49. 丑数
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。1、题目分析动态规划真的就很懵,这个题目是求前n个丑数,只包含质因子2、3、5的数就称之为丑数。,这样的数我们把它称之为丑数,也就是只能拆分成2、3、5的乘积,第一个丑数就是1,我们采用动态规划的方法去做,因为最终的结果要求是从小到大,所以我们不得不原创 2020-07-27 17:37:58 · 95 阅读 · 0 评论 -
动态规划之最小路径:64.最小路径
给定一个包含非负整数的mxn网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。1、题目分析从左上角走到右下角,然后每次只能向下或者向右走一步,最后得到一条最短路径,很显然典型的动态规划问题。2、解题分析动态规划 初始化一个dp数组,和给定数组一样大小,dp[0][0]...原创 2020-07-23 20:36:02 · 334 阅读 · 0 评论 -
卡塔兰数:96. 不同的二叉搜索树
给定一个整数n,求以1 ...n为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2...原创 2020-07-16 11:28:18 · 114 阅读 · 0 评论 -
《Leetcode》120. 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。1、题目分析最小路径和,很明显这就是一道动态规划的问题,那么肯定要找动态规划方程f[i][j]表示在(i,j)位置原创 2020-07-14 21:12:08 · 79 阅读 · 0 评论 -
动态规划:剑指 Offer 47. 礼物的最大价值
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物1、题目分析这是一道非常典型的动态规划问题,拿到礼物的方向有两个:向右,向下。因此用f[原创 2020-07-14 19:53:03 · 113 阅读 · 0 评论 -
《Leetcode》309. 最佳买卖股票时机含冷冻期
给定一个整数数组,其中第i个元素代表了第i天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]1、题目分析有三个状态:买入、卖出、冷冻。这种题目很显然都是利用动态规划...原创 2020-07-10 16:13:51 · 85 阅读 · 0 评论 -
《Leetcode》63. 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?示例1:输入:[ [0,0,0], [0,1,0], [0,0,0]]输出: 2解释:3x3 网格的正中间有一个障碍物。从左上角到右下角一共有 2 条不同的路径:1. 向右 -> 向右 ->...原创 2020-07-06 17:10:30 · 114 阅读 · 0 评论 -
718. 最长重复子数组
给两个整数数组A和B,返回两个数组中公共的、长度最长的子数组的长度。目录1、题目分析2、解题分析3、代码示例 1:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3解释: 长度最长的公共子数组是 [3, 2, 1]。1、题目分析求两个数组公共的子数组的长度,那么可以用较短的那个字符串去匹配长的字符串,使用枚举法。像最长最短的往往都可以用动态规划,不过要找出动态转移方程来。2、解题分析主要说一下滑窗法,选取较短的那个作为滑动的数...原创 2020-07-01 11:47:53 · 151 阅读 · 0 评论 -
《Leetcode》70. 爬楼梯
假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定n是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶思路:1、题目分析有多少方法可以爬到楼顶,那第n层有多...原创 2020-06-13 16:53:35 · 98 阅读 · 0 评论 -
《Leetcode》面试题46. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"思路:有一次倒在了动态规划的问题上,一开始我把这个题目认为是排列组合,最后发现我太天真了;既然DP那就是以原创 2020-06-09 21:54:30 · 203 阅读 · 0 评论 -
《Leetcode》837. 新21点
爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?示例1:输入:N = 10, K = 1, W = 10输出:1.00000说明:爱丽丝得到一张卡,然后停止。示例2:输入:N ..原创 2020-06-03 22:23:16 · 122 阅读 · 0 评论 -
221.最大正方形
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。示例:输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4思路:给出一个矩形,让去求解其只包含1的最大正方形,并返回面积。所以其实也就是求围成正方形的最大边长。这个题我是没有思路,以前逃避动态规划,今天不得不面对动态规划。那么这个题有两个解法,一个是二进制解法;另一个是动态规划算法。二进制解法的思路就是枚举所有行的组合,主要有三个步骤,第一:先将原来的二维.原创 2020-05-09 12:58:57 · 241 阅读 · 0 评论