动态规划(Dynamic Programming)
leetcode,动态规划分类
朱师傅哈
这个作者很懒,什么都没留下…
展开
-
416. 分割等和子集(Partition Equal Subset Sum)
416. 分割等和子集(Partition Equal Subset Sum)题解动态规划复杂度分析PythonJava(待完成)题解本题的难点,将其转化为0−10-10−1背包问题。动态规划由二进制的两条性质得到递推公式:dp[i]={dp[i−1]+1i为奇数dp[i//2]i为偶数dp[i]=\left\{\begin{array}{ll}{dp[i-1]+1} & {i为...原创 2019-12-17 14:26:24 · 163 阅读 · 0 评论 -
338. 比特位计数(Counting Bits)
338. 比特位计数(Counting Bits)题解动态规划复杂度分析PythonJava(待完成)题解本题主要考察二进制的自身特性。二进制的两个特性:奇数的二进制中1的个数=它上一位偶数的二进制中1的个数+1如:(3)10=(11)2,(2)10=(10)2(3)_{10}=(11)_{2},(2)_{10}=(10)_{2}(3)10=(11)2,(2)10=(10)2...原创 2019-12-17 10:36:11 · 232 阅读 · 0 评论 -
322. 零钱兑换(Coin Change)
322. 零钱兑换(Coin Change)题解记忆化回溯(自顶向下)复杂度分析PythonJava(待完成)动态规划(自下而上)复杂度分析PythonJava(待完成)题解记忆化回溯(自顶向下)如上图,在回溯过程中,将中间结果保存下来,这样可将复杂度降低到O(n)O(n)O(n)。初始化记忆词典memo={0:0}memo=\{0:0\}memo={0:0},表示0元的组成种类为0...原创 2019-12-16 16:54:42 · 306 阅读 · 0 评论 -
304. 二维区域和检索 - 矩阵不可变(Range Sum Query 2D - Immutable)
303. 区域和检索 - 数组不可变(Range Sum Query - Immutable)题解缓存+动态规划复杂度分析PythonJava(待完成)题解缓存+动态规划同样借助于缓存的思想:如图所示:若求蓝色区域内的元素和,等于蓝色区域右下角到(0,0)(0,0)(0,0)处的累加和去掉红色绿色和绿色部分的累加和。红色部分+绿色部分=矩阵左上角(0,0)(0,0)(0,0)到红色部分...原创 2019-12-13 15:00:56 · 93 阅读 · 0 评论 -
303. 区域和检索 - 数组不可变(Range Sum Query - Immutable)
303. 区域和检索 - 数组不可变(Range Sum Query - Immutable)题解缓存+动态规划复杂度分析PythonJava(待完成)题解每次调用函数计算一次都需要O(n)O(n)O(n)复杂度,因此借助缓存来保存区域和。若使用二维dpdpdp,dp[i][j]dp[i][j]dp[i][j]表示iii到jjj的区域和,需要O(n2)O(n^{2})O(n2)空间复杂度。...原创 2019-12-13 14:30:19 · 94 阅读 · 0 评论 -
300. 最长上升子序列(Longest Increasing Subsequence)
300. 最长上升子序列(Longest Increasing Subsequence)题解动态规划复杂度分析PythonJava(待完成)动态规划+二分查找复杂度分析PythonJava(待完成)题解动态规划dp[i]dp[i]dp[i]表示到当前位置的最长上升子序列的长度。特判,若数组为空,返回0初试化dp=[1,1,⋯ ,1]dp=[1,1,\cdots,1]dp=[1,1...原创 2019-12-12 22:03:17 · 98 阅读 · 0 评论 -
279. 完全平方数(Perfect Squares)
279. 完全平方数(Perfect Squares)题解动态规划复杂度分析PythonJava(待完成)动态规划+空间优化复杂度分析PythonJava(待完成)题解动态规划dp[i]dp[i]dp[i]表示iii最少可以由几个平方数构成。初试化dp=[0,1,2,⋯ ,n]dp=[0,1,2,\cdots,n]dp=[0,1,2,⋯,n],长度为n+1n+1n+1。遍历dpdpdp...原创 2019-12-12 14:25:00 · 310 阅读 · 0 评论 -
221. 最大正方形(Maximal Square)
221. 最大正方形(Maximal Square)题解动态规划复杂度分析PythonJava(待完成)动态规划+空间优化复杂度分析PythonJava(待完成)题解动态规划dp[i][j]dp[i][j]dp[i][j]表示以第iii行,第jjj列处为右下角的最大正方形的边长。仅当该位置为111时,才有可能存在正方形。且递推公式为:dp[i][j]=min(dp[i−1][j−1],d...原创 2019-12-08 15:05:17 · 441 阅读 · 0 评论 -
198. 打家劫舍(House Robber)
198. 打家劫舍(House Robber)题解动态规划复杂度分析PythonJava(待完成)题解动态规划dp[i]dp[i]dp[i]表示到第iii个房屋的偷窃最高金额。显然,递推公式为:dp[i]=max(dp[i−2]+nums[i−1],dp[i−1])dp[i]=max(dp[i-2]+nums[i-1],dp[i-1])dp[i]=max(dp[i−2]+nums[i−1]...原创 2019-12-07 19:35:59 · 117 阅读 · 0 评论 -
174. 地下城游戏(Dungeon Game)
174. 地下城游戏(Dungeon Game)题解动态规划复杂度分析PythonJava(待完成)题解动态规划dp[i][j]dp[i][j]dp[i][j]表示到达房间dungeon[i][j]dungeon[i][j]dungeon[i][j]所需的最小生命值。若从左上角递推到右下角(自顶向下),当前位置的最小生命值和当前位置尚存的生命值对后续结果会产生很大影响,故放弃这个思路,选...原创 2019-12-07 17:32:07 · 285 阅读 · 0 评论 -
152. 乘积最大子序列(Maximum Product Subarray)
152. 乘积最大子序列(Maximum Product Subarray)题解动态规划复杂度分析PythonJava(待完成)题解动态规划因为有负数的存在,我们保存当前位置的最大乘积,和最小乘积,因为负数可以将最大乘积变最小,将最小变最大。初试化结果max_res=MINmax\_res=MINmax_res=MIN,当前最大乘积max_num=1max\_num=1max_num=...原创 2019-12-07 15:21:14 · 132 阅读 · 0 评论 -
139. 单词拆分(Word Break)
139. 单词拆分(Word Break)题解动态规划复杂度分析PythonJava(待完成)记忆化回溯复杂度分析PythonJava(待完成)题解动态规划初始化dp=[False,⋯ ,False]dp=[False,\cdots,False]dp=[False,⋯,False],长度为n+1n+1n+1。nnn为字符串长度。dp[i]dp[i]dp[i]表示sss的前iii位是否可...原创 2019-12-06 14:39:42 · 171 阅读 · 0 评论 -
132. 分割回文串 II(Palindrome Partitioning II)
132. 分割回文串 II(Palindrome Partitioning II)题解动态规划复杂度分析PythonJava(待完成)记忆化回溯复杂度分析PythonJava(待完成)题解动态规划初始化最小分割次数数组min_cut={0,1,2,⋯ ,n−1}min\_cut=\{0,1,2,\cdots,n-1\}min_cut={0,1,2,⋯,n−1},长度为字符串的长度nnn。...原创 2019-12-03 23:05:04 · 211 阅读 · 0 评论 -
115. 不同的子序列(Distinct Subsequences)
115. 不同的子序列(Distinct Subsequences)题解动态规划复杂度分析PythonJava(待完成)题解动态规划我们使用dp[i][j]dp[i][j]dp[i][j]表示SSS的前jjj个字符有几种方式构成TTT的前iii个字符。在SSS和TTT前插入空字符,便于计算。易知,初始化dpdpdp数组第一行全为111,第一列除首位全为000。dp[0][j]dp[0][...原创 2019-11-29 15:04:32 · 153 阅读 · 1 评论 -
97. 交错字符串(Interleaving String)
97. 交错字符串(Interleaving String)题解动态规划复杂度分析PythonJava(待完成)题解动态规划我们使用dp[i][j]dp[i][j]dp[i][j]表示s1s_{1}s1的前iii个字符和s2s_{2}s2的前jjj个字符是否能构成s3s_{3}s3的前i+ji+ji+j个字符。首先,dp[0][0]dp[0][0]dp[0][0]一定是TrueTr...原创 2019-11-28 22:22:31 · 205 阅读 · 0 评论 -
96. 不同的二叉搜索树(Unique Binary Search Trees)
96. 不同的二叉搜索树(Unique Binary Search Trees)题解动态规划复杂度分析PythonJava(待完成)题解典型的卡特兰数问题,可使用动态规划来解决。设nnn个结点的二叉搜索树的种类为G(n)G(n)G(n),f(i)f(i)f(i)表示以iii为根节点的二叉搜索树的种数。可得:G(n)=f(1)+f(2)+⋯+f(n)G(n)=f(1)+f(2)+\cdots...原创 2019-11-28 11:33:07 · 137 阅读 · 0 评论 -
95. 不同的二叉搜索树 II(Unique Binary Search Trees II)
95. 不同的二叉搜索树 II(Unique Binary Search Trees II)题解递归复杂度分析PythonJava(待完成)题解卡特兰数问题递归二叉排序树的重要性质是,左子树上的节点值一定小于根节点,右子树上的节点值一定大于根节点。由此,可知若根节点为iii,则左子树的节点为[1,...,i−1][1,...,i-1][1,...,i−1],右子树的节点为[i+1,...,...原创 2019-11-28 00:21:57 · 117 阅读 · 0 评论 -
91. 解码方法(Decode Ways)
91. 解码方法(Decode Ways)题解动态规划复杂度分析PythonJava(待完成)空间优化复杂度分析PythonJava(待完成)题解注意这几种情况,是无法解码的:以0开头,如:“0123”,“000”0前的数字大于2,如:“215021”。0前数字小于等于2时,是可以解码的,如:“20105”。动态规划所以,算法设计如下:特判,若sss为空或者s[0]=="0"...原创 2019-11-27 20:04:15 · 227 阅读 · 0 评论 -
72. 编辑距离(Edit Distance)
72. 编辑距离(Edit Distance)题解动态规划复杂度分析PythonJava(待完成)题解动态规划初试化dpdpdp,为(n1+1)∗(n2+1)(n1+1)*(n2+1)(n1+1)∗(n2+1)的全零矩阵,n1n1n1为word1word1word1的长度,n1n1n1为word2word2word2的长度初始化第一行和第一列,如图所示:""""""表示空字符,...原创 2019-11-25 10:38:39 · 126 阅读 · 0 评论 -
70. 爬楼梯(Climbing Stairs)
70. 爬楼梯(Climbing Stairs)题解动态规划复杂度分析PythonJava(待完成)公式复杂度分析PythonJava(待完成)题解典型的斐波那契数列问题,可使用递归算法,复杂度太高,这里不做介绍。仅介绍动态规划和公式法动态规划初试化dp=[0,...,0]dp=[0,...,0]dp=[0,...,0],长度为n+1n+1n+1。若n<2n<2n&...原创 2019-11-24 22:20:22 · 132 阅读 · 0 评论 -
32. 最长有效括号(Longest Valid Parentheses)
32. 最长有效括号(Longest Valid Parentheses)题解栈+排序复杂度分析PythonJava(待完成)栈 优化(不排序)复杂度分析PythonJava(待完成)动态规划复杂度分析PythonJava(待完成)题解栈+排序括号匹配,第一时间想到用栈进行匹配,保存下可以匹配的索引下标。然后将匹配索引排序,找到最长连续子序列。初试化栈stack=[]stack=[]s...原创 2019-11-24 21:09:30 · 124 阅读 · 0 评论 -
10. 正则表达式匹配(Regular Expression Matching)
10. 正则表达式匹配(Regular Expression Matching)题解递归复杂度分析PythonJava(待完成)动态规划法复杂度分析PythonJava(待完成)题解递归递归函数isMatch(s,p)isMatch(s,p)isMatch(s,p),sss表示待匹配字符,ppp表示字符规律若ppp为空,此时返回sss是否为空。表示若字符规律已经为空,若sss还不为空,此...原创 2019-11-23 22:06:18 · 370 阅读 · 0 评论 -
5. 最长回文子串(Longest Palindromic Substring)
5. 最长回文子串(Longest Palindromic Substring)题解动态规划复杂度分析PythonJava(待完成)中心拓展法复杂度分析PythonJava(待完成)题解动态规划特判,当sss的长度为111或者000时,返回sss。初试化最长回文子串的开始索引startstartstart和最长长度max_len=1max\_len=1max_len=1初试化...原创 2019-11-21 20:02:04 · 94 阅读 · 0 评论 -
120. 三角形最小路径和(Triangle)
120. 三角形最小路径和(Triangle)题解动态规划复杂度分析PythonJava(待完成)题解动态规划,从上到下,保存每一层每个位置的最小路径和。动态规划特判,若triangletriangletriangle为空,返回000,若只有一层len(triangle)==1len(triangle)==1len(triangle)==1,返回元素。从第二行开始,遍历区间[1,n)[...原创 2019-11-12 20:22:49 · 183 阅读 · 0 评论 -
119. 杨辉三角II(Pascal's TriangleII)
119. 杨辉三角II(Pascal's TriangleII)题解模拟法(动态规划)复杂度分析PythonJava(待完成)题解O(k)O(k)O(k)空间复杂度,我们在118.杨辉三角基础上进行优化,仅保存上一行。模拟法(动态规划)特判,若k==0k==0k==0,返回[1][1][1]初始化dp=[1,1]dp=[1,1]dp=[1,1],表示第二行遍历区间[3,k+2)[3,...原创 2019-11-12 12:04:02 · 151 阅读 · 0 评论 -
118. 杨辉三角(Pascal's Triangle)
118. 杨辉三角(Pascal's Triangle)题解模拟法(动态规划)复杂度分析PythonJava(待完成)题解很自然的想法,模拟真实的杨辉三角填入过程。边界全为1,不为1的位置dp[i][j]=dp[i−1][j−1]+dp[i−1][j]dp[i][j]=dp[i-1][j-1]+dp[i-1][j]dp[i][j]=dp[i−1][j−1]+dp[i−1][j]模拟法(动态规...原创 2019-11-12 11:18:00 · 145 阅读 · 0 评论 -
64. 最小路径和(Minimum Path Sum)
64. 最小路径和(Minimum Path Sum)题解动态规划复杂度分析PythonJava(待完成)题解固定的套路62.不同路径CSDN或LeetCode63.不同路径IICSDN或LeetCode只需改变边界上的和,剩下继续使用动态规划即可。动态规划特判:若gridgridgrid为空,返回000初始化数组行数mmm和列数nnn。初始化第一行的边界路径和,遍历区间[1,...原创 2019-11-06 20:49:16 · 98 阅读 · 0 评论 -
63. 不同路径II(Unique PathsII)
63. 不同路径II(Unique PathsII)题解动态规划复杂度分析PythonJava(待完成)题解62.不同路径CSDN或LeetCode和62不同的是,本题边界上的路径数受障碍物的影响且网格处存在障碍物,则到达此处的路径数为0。因此,只需在边界路径数上和更新路径时做些改变就可满足本题要求。动态规划特判:若obstacleGridobstacleGridobstacle...原创 2019-11-06 20:07:02 · 178 阅读 · 0 评论 -
62. 不同路径(Unique Paths)
62. 不同路径(Unique Paths)题解动态规划复杂度分析Python优化1复杂度分析优化2复杂度分析Java(待完成)题解动态规划如图所示,显然边界网格上的路径数为1,。对于网格(i,j)(i,j)(i,j)处的路径数,其中0<i<m0<i<m0<i<m,0<j<n0<j<n0<j<n。等于网格(i−1,j)...原创 2019-11-06 17:32:18 · 397 阅读 · 0 评论