leetcode动态规划
文章平均质量分 54
岗岗ganggang
这个作者很懒,什么都没留下…
展开
-
leetcode 376. 摆动序列 python
题目描述:题解:1.如果输入nums只有一个元素返回1,如果nums有两个元素,如果两个数字不等则返回2,否则返回1.2.计算nums数组中相邻数字的差,保存在gaps数组。最终摇摆序列的长度=max(第一个差值为正数的序列最长长度,第一个差值为负数的序列最长长度)+1,分别用p_len n_len记录第一个差值为正数和负数的序列长度,p_start,n_start分别记录差值为正数和负数的开始位置。3.分别从p_start依次寻找差值为负,正,负....记录长度,n_start做.原创 2021-12-20 15:48:15 · 775 阅读 · 0 评论 -
leetcode5. 最长回文子串
题目描述:题解:参考https://blog.csdn.net/weixin_40449300/article/details/823188491.暴力搜索对输入s的每个位置i,判断从len-1到i的子串是否回文def longestPalindrome(self, s): lens = len(s) maxlen = 0 res =[] for i in range(lens): for j in range(lens,i,-1):原创 2021-04-12 17:45:06 · 78 阅读 · 0 评论 -
leetcode 221. 最大正方形 python
题目描述:题解:动态规划1.创建dp 大小为(matrix行+1)*(matrix列数+1) 初始化为全02.dp[i][j]表示以[i-1][j-1]为右下角坐标的全1正方形最大边长。如果matrix[i-1][j-1]=='1',dp[i][j]=1+min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])3.返回最大边长值的平方。class Solution: def maximalSquare(self, matrix: List[Lis.原创 2021-12-17 16:00:28 · 587 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子python
题目描述:题解:1.如果输入n=2,返回1,输入n=3,返回2.2.dp[i]表示长度为i可以得到的最大乘积,dp[1]=1,dp[2]=2,dp[3]=3,因为对于n=2 3的情况,最大值是不做切分,如果输入n<3,已经直接返回,dp是为了确定n>=4的最大乘积。3.n>=4时,对于i取值从1到i//2,取最大的dp[i-j]*dp[j]class Solution: def cuttingRope(self, n: int) -> int: .原创 2021-12-17 09:46:11 · 387 阅读 · 0 评论 -
leetcode 304. 二维区域和检索 - 矩阵不可变python
题目描述:题解:矩阵前缀和1.求坐标(0,0)到(i,j)的matrix对应位置之和。图中红色部分=两个绿色部分相加-蓝色部分+[i,j]用thesum[i][j]表示坐标[i,j]到[0,0]的和,thessum[i][j] = thesum[i-1][j]+thesum[i][j-1]-thesum[i-1][j-1]+,matrix[i][j]2.求坐标[i,j]到[m,n]值之和。[m][n]到[i][j]矩阵值之和=红色部分-两个绿色部分+蓝色部...原创 2021-12-16 11:22:19 · 303 阅读 · 0 评论 -
leetcode 931. 下降路径最小和 python
题目描述:题解:动态规划1.rows表示输入matrix行数,cols表示matrix列数,设置一个大小和输入matrix相等的dp,dp[rows-1]和matrix[rows-1]相等。2.i从rows-2开始,对dp[i][j]进行更新,dp[i][j]=min(,dp[i+1]pj-1],dp[i+1][j],dp[i+1][j+1])+matrix[i][j],需要注意j=0或cols-1的情况。3.返回dp[0]中的最小值。class Solution: .原创 2021-12-15 15:15:16 · 340 阅读 · 0 评论 -
leetcode 264. 丑数 II python
题目描述:题解:丑数中每个数字都可以由丑数序列u_numbers中之前的数字乘以2 3 5得到1.用三个idx2 idx3 idx5记录分别用u_numbers中哪个数字乘以2 3 5,idx初始化为0,u_numbers初始化为[1]。2.分别计算u_numbers[idx2]*2u_numbers[idx3]*3u_numbers[idx5]*5,求出三个结果中的最小值next_num,加入u_numbers中,并将对应的idx+1。class Solution: ...原创 2021-12-14 11:27:45 · 235 阅读 · 0 评论 -
leetcode 91. 解码方法 python
题目描述:题解:动态规划1.如果s以0开始,无法解码,返回0.2.如果s中s[i-1:i+1]=='00'或者s[i-1]>'2' s[i]=='0'(因为s[i-1]>'2‘,所以s[i-1]必须与s[i-2]一起进行解码,但s[i]为0,无法作为一个合法解码的开头),返回0.3.如果s[i-1:i+1]在1-26之间并且s[i]不为'0',s[i-1:i+1]可以一起解码,也可以s[i-1]和s[i-2]解码,s[i]单独解码。4.如果s[i]=’0‘,s[i].原创 2021-12-11 20:23:10 · 288 阅读 · 0 评论 -
leetcode 413. 等差数列划分python
题目描述:题解:动态规划1.创建一个长度为len(nums)+1的数组dp,全部初始化为0,一个记录最终结果的result。2.i从2开始,如果nums[i]-nums[i-1]==nums[i-1]-nums[i-2],dp[i]=dp[i-1]+1,否则dp[i]=0,result=result+dp[i]class Solution: def numberOfArithmeticSlices(self, nums: List[int]) -> int: .原创 2021-12-11 17:38:29 · 250 阅读 · 0 评论 -
leetcode 42. 接雨水 python
题目描述:题解:1.找出height中height最大的位置highest_idx。2.从左开始向hightest_idx搜索,同时维护一个左边最高值left_highest,搜索过程中,如果height[i]>left_highest,则将left_highest更新为height[i],如果当前height[i]小于left_highest,则容量加left_highest-height[i]3.从右开始向hightest_idx搜索,同时维护一个右边最高值right_hig.原创 2021-12-10 11:12:01 · 350 阅读 · 0 评论 -
leetcode139. 单词拆分python
题目描述:题解:动态规划参考:https://segmentfault.com/a/11900000230207061.dp[i]表示s中前i个字符构成的字符串可否拆分为wordDict中的单词。dp初始化为全部False,dp[0]=True(dp长度为len(s)+1)2.i从0开始到len(s),将s[0:i]分为两部分:s[0:j] s[j:i],dp[i]为True还是False由这两部分共同决定,如果dp[j]=True,则说明s[0:j]部分可以拆分为wordDict中内容原创 2021-12-10 10:40:27 · 258 阅读 · 0 评论 -
leetcode 714. 买卖股票的时机含手续费 python
题目描述:题解:与leetcode122. 买卖股票的时机 II python_ganggang的博客-CSDN博客类似1.初始化dp=[[0]*2 for i in range(len(prices))],dp[i][0]表示第i天卖出股票的收益,dp[i][1]表示第i天买入股票的收益,dp[0][1]=-prices[0]。2.dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]-fee) dp[i][1]=max(dp[i-1][1...原创 2021-12-09 15:37:00 · 281 阅读 · 0 评论 -
leetcode 309. 买卖股票时机含冷冻期 python
题目描述:卖出股票的第二天为冷冻期。题解:动态规划1.初始化dp = [[0]*3 for i in range(len(prices))],其中dp[i][0]表示第i天作为卖出的最大收益,dp[i][1]表示第i天作为买入的最大收益,dp[i][2]表示第i天作为冷冻的最大收益,其中dp[0][1]=-prices[0],相当于第0天以prices[0]买入。2.对i从1到len(prices)-1,dp[i][0]=max(dp[i-1][0],dp[i-1][1]+pric.原创 2021-12-09 11:21:57 · 86 阅读 · 0 评论 -
leetcode122. 买卖股票的时机 II python
题目描述:题解一:贪心参考情况一:一直增长:[1,2,3,4,5] result=2-1+3-2+4-3+5-4=4 与第一天买入,最后一天卖出相同。情况二:一直下降:利润为0, 不存在一个i,prices[i]>prices[i-1]情况三:先增长再下降:[a b c] a-b增长,b-c下降,a-b段prices[i]-prices[i-1]的和与b-a相等。情况四:先下降再增长:[a b c] a-b下降,b-c增长,b-c段prices[..原创 2021-12-08 20:15:22 · 410 阅读 · 0 评论 -
leetcode 121. 买卖股票的时机 python
题目描述:题解:第i天卖出可获取的最大利益=prices[i]-min,min为前i-1天的最低价格1.buy记录前i-1天最低价格,初始化为prices[0],earn记录最大利润,初始化为-1。2.从prices[1]开始遍历prices,earn=max(earn,prices[i]-buy) buy=min(buy,prices[i])class Solution: def maxProfit(self, prices: List[int]) -> int:.原创 2021-12-08 11:14:53 · 60 阅读 · 0 评论 -
leetcode 1014. 观光组合Best Sightseeing Pair python
题目描述:题解一:超时class Solution(object): def maxScoreSightseeingPair(self, values): nums = len(values) dp = [0 for i in range(nums)] for i in range(nums): for j in range(i+1,nums): dp[i] = max(dp[i],原创 2021-12-08 11:03:02 · 1184 阅读 · 0 评论 -
leetcode 1567. 乘积为正数的最长子数组长度python
题目描述:题解:动态规划1.维护两个数组: dppos[i]表示以nums[i]结尾的积为正数的子数组长度,dpneg[i]表示以nums[i]结尾的积为负数的子数组长度,初始化为全0,如果nums[0]>0则dppos[0]=1,如果nums[i]<0则dpneg[0]=12.如果nums[i]>0,则dppos[i]=dppos[i-1]+1,对dpneg的处理比较特殊,如果dpneg[i-1]为0,那么dpneg[i]仍然应该为0.比如数组[0,1],0对应.原创 2021-12-07 16:23:32 · 200 阅读 · 0 评论 -
leetcode 152. 乘积最大子数组 python
题目描述:题解:动态规划1.维护两个变量,maxres和minres,在nums[i]位置的maxres=max(maxres*nums[i],nums[i])minres = min(minres*nums[i],nums[i])2.如果nums[i]为负数,交换minres和maxres的值。class Solution: def maxProduct(self, nums: List[int]) -> int: maxres = 1原创 2021-12-07 15:52:57 · 97 阅读 · 0 评论 -
leetcode918. 环形子数组的最大和python
题目描述:题解:参考918. 环形子数组的最大和(Python) - 简书思路:如果数组被分为三段ABC,如果子数组和最大的在C+A段,那么子数组和最小的部分在B段。1.先按照非环形数组采用动态规划的方法,求出数组中子数组的最大和res。2.同样采用动态规划的方法,求出子数组最小和res_min3.环形数组的子数组最大和为res和sum(nums)-res_min中的最大值。注意:如果输入数组全为负数,则返回数组中最大值。class Solution(objec..原创 2021-12-06 17:26:05 · 416 阅读 · 0 评论 -
leetcode45. 跳跃游戏 II
题目描述:题解:采用贪心的思想解决:先从输入数组nums的最后一位开始,将start初始化为len(nums)-1,向前搜索,判断每个位置i的nums[i]即可以跳跃的最大长度是否大于start-i的距离,如果满足nums[i]>=start-i的条件,则将start-nums[i]记录为maxdis,不断对maxdis进行更新,将具有最大maxdis的位置i设为下一次的start,直到start=0即到达了初始位置,返回步数steps即从最后一个位置开始向前跳跃,每次选择可以跳跃原创 2021-07-14 11:21:22 · 70 阅读 · 0 评论 -
leetcode 740. 删除并获得点数python
题目描述:题解:参考评论区设置一个新数组,newnums[nums[i]]保存输入的nums中所有值等于nums[i]的和。class Solution(object): def deleteAndEarn(self, nums): newnums = [0 for i in range(10001)] for i in range(len(nums)): newnums[nums[i]]+=nums[i]原创 2021-12-04 20:16:34 · 378 阅读 · 0 评论 -
leetcode 213. 打家劫舍 II python
题目描述:题解:参考leetcode评论区直接使用leetcode198的代码class Solution(object): def rob(self, nums): if len(nums)==1: return nums[0] nums1 = nums[0:len(nums)-1] nums2 = nums[1:len(nums)] return max(self.linerob(n..原创 2021-12-04 19:47:25 · 185 阅读 · 0 评论 -
leetcode 746. 使用最小花费爬楼梯 python
题目描述:题解:1.在cost前后各加一个0构成newcost,表示开始和结束,dp[i]表示从当前位置到顶的cost,长度与newcost相同。2. dp[len(newcost)-1] =0,dp[len(newcost)-2] =newcost[len(newcost)-2],dp[i] = min(dp[i+1],dp[i+2])+newcost[i]。class Solution(object): def minCostClimbingStairs(self,..原创 2021-12-03 11:10:28 · 250 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串python
题目描述:题解:动态规划1.dp[i]表示以s[i]开头的无重复字符的子串。2.如果s[i]不在s[i+1:i+1+dp[i+1]]中,则dp[i]=dp[i+1]+1,否则dp[i]=s[i]在s[i+1:i+1+dp[i+1]]的位置+1class Solution(object): def lengthOfLongestSubstring(self, s): lens = len(s) if lens==0: ret原创 2021-12-03 10:49:34 · 234 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串python
题目描述:题解:动态规划1.将输入num从int型转为str snum,dpres保存结果,dp[i]表示snum[0:i-1]有多少种组合方式。dp[0]=0,dp[1]=0(对应snum[0]一个字符,只有一种方法),要注意dpres的下标比snum大1。2.对snum的第i-1个字符进行判断:如果snum[i-2]+snum[i-1]<26并且snum[i-2]不为0(避免06 05这样不合法的情况),则dpres[i]=dpres[i-1]+dpres[i-2],因为.原创 2021-12-03 09:28:53 · 179 阅读 · 0 评论 -
leetcode 97. 交错字符串 python
题目描述:题解:动态规划dp[i][j]表示s[0:i-1]与s[0:j-1]是否可以交错组成s3[0:i+j-1]1.dp[0][0]=True2.dp[i][0] = dp[i-1][0] && s1[i-1]==s3[i-1]3.dp[0][j] = dp[0][j-1] && s2[j-1]==s3[j-1]4.dp[i][j] = (dp[i-1][j] and s1[i-1]==s3[i+j-1]) or (dp[i][j-1] a..原创 2021-12-02 15:45:20 · 159 阅读 · 0 评论 -
leetcode1137. 第 N 个泰波那契数python
题目描述:题解:class Solution(object): def tribonacci(self, n): tres = [] tres.append(0) tres.append(1) tres.append(1) if n<=2: return tres[n] for i in range(3,n+1): tres.append原创 2021-12-02 09:46:10 · 123 阅读 · 0 评论 -
leetcode509. 斐波那契数python+java
题目描述:题解:class Solution(object): def fib(self, n): fibres = [] fibres.append(0) fibres.append(1) if n<=1: return fibres[n] for i in range(2,n+1): fibres.append(fibres[i-1]+fibres[原创 2021-12-02 09:42:07 · 301 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值python
题目描述:题解:动态规划rows表示输入grid的行数,cols表示输入grid的列数,用dpres[i][j]表示从[i,j]出发可以获得的最大价值。1.在位置[rows-1,cols-1],可以拿到的礼物的最大价值就是grid[rows-1,cols-1]。2.在rows-1行,因为只可以向右或向下移动,此位置只能选择向右移动因此dpres[rows-1][j]=dpres[rows-1][j+1]+grid[rows-1][j]3.在cols-1列,因为因为只可以向右或向.原创 2021-12-02 09:33:40 · 150 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润python+java
题目描述:题解一:超时class Solution(object): def maxProfit(self, prices): maxearn = 0 days = len(prices) earn = [[0 for i in range(days)]for j in range(days)] for i in range(days): for j in range(days):原创 2021-12-01 10:03:35 · 206 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题python
题目描述:题解:和上一题基本一致剑指 Offer 10- I. 斐波那契数列python_ganggang的博客-CSDN博客1.0个台阶有1种方法,1个台阶有1种方法。2.用ways数组保存不同台阶数有多少种跳法。3.结果取模,如果在每次计算的时候取模会比最后加一次判断时间更短。class Solution(object): def numWays(self, n): ways = [] ways.append(1) .原创 2021-12-01 09:39:32 · 83 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列python+java
题目描述:题解:动态规划最开始用递归的方法超时。1.fibres保存斐波那契数列的值,fibres[0]=0 fibres[1]=12.对i从2到n分别根据公式计算fibres[i]3.对fibres[n]结果根据要求取模。class Solution(object): def fib(self, n): fibres = [] fibres.append(0) fibres.append(1) for .原创 2021-12-01 09:28:36 · 568 阅读 · 0 评论 -
leetcode 375. 猜数字大小 II python
题目描述:题解:动态规划参考力扣LeetCode375. 猜数字大小 II(python,动态规划) - 代码先锋网解题思路:利用dp[i][j]表示从[i,j]范围内赢得比赛所需要的钱数,如果给定范围[i,j],从中选择一个数字x,有两种可能结果:<1>要求的数字比x小,在[i,x-1]中<2>要求的数字比x大,在[x+1,j]中因此,如果给出猜测x,如果猜错,需要的钱数是x+max(dp[i][x-1],dp[x+1][j])...原创 2021-11-12 10:53:57 · 314 阅读 · 0 评论 -
leetcode 198. 打家劫舍 python
题目描述:题解:动态规划题目三种情况:1.输入nums只有一个元素,直接返回nums[0]2.输入nums有两个元素,直接返回两个元素中的最大值。当nums中元素数量大于三采用动态规划的方法:创建数组maxaccount,maxamount[i]表示偷窃位置i,在nums[0:i]中可以获取的最大值,即maxamount[i]=max(nums[i]+maxamount[i-2],nums[i]+maxamount[i-3])class Solution(object):.原创 2021-10-12 16:40:50 · 138 阅读 · 0 评论 -
2021-07-14
题目描述:题解:参考:https://blog.csdn.net/qq_36512295/article/details/101049734利用动态规划方法解决:1.dp[i]保存到字符串s的第i个位置,有多少种解码方法。2.对s[i]:如果s[i-1:i+1]为'00'或s[i]='0',s[i-1]>‘2’,则所有解码方法都不合法,返回0.如果s[i-1:i+1]在1-26之间,且s[i]不为'0',则s[i]可与s[i-1]一起解码,也可单独解码,则dp[i.原创 2021-07-14 10:34:27 · 76 阅读 · 0 评论 -
leetcode70. 爬楼梯
题目描述:题解:采用动态规划的方法:一个台阶n=1时,只有一种方法 1两个台阶n=2时,有两种方法:1 1,2三个台阶n=3时,有三种方法:1 1 1,1 2,2 1四个台阶n=4时,有五种方法:1 1 1 1,2 2,1 1 2,2 1 1,1 2 1观察可以发现规律:res[i]=res[i-2]+res[i-1]class Solution(object): def climbStairs(self, n): if n==1:原创 2021-07-13 21:01:50 · 50 阅读 · 0 评论 -
leetcode118. 杨辉三角
题目描述:题解:1.三角形中的每一行第一个和最后一个数字均为02.其他数字为第i-1行第j-1和第j个数之和。class Solution(object): def generate(self, numRows): result = [] for i in range(numRows): line = [] for j in range(i+1): if j ..原创 2021-07-09 16:09:26 · 72 阅读 · 0 评论 -
leetcode64. 最小路径和
题目描述:题解:采用动态规划的方法,列出表格对每个位置求从左上角到该位置的最短距离,记录为dp_memo1.最左上位置的最短路径即为grid[0][0]2.对m*n 网格的第一排,只有从左边网格向右移动得到,dp_memo[i][0]=dp[i-1][0]+grid[i][j]3.对m*n网格第一列,只有从上面网格向下移动得到,dp_memo[0][j]=dp_memo[0][j-1]+grid[i][j]4.对其他位置,最短距离从左边网格向右移动或上面网格向下移动得到.原创 2021-07-09 15:49:08 · 143 阅读 · 0 评论 -
leetcode63. 不同路径 II
题目描述:题解:与62不同路径问题相似,只是需要考虑障碍物问题,采用动态规划的方法参考:https://blog.csdn.net/laurasam/article/details/118599579dp[i][j]记录i*j网格可行路径数1.先将dp[i][0] dp[0][j]初始化为1,需要注意该位置是否有障碍物,并且 如果该位置之前出现过障碍物,则dp[i][0] dp[0][j]仍为02.对每个小于m的i,小于n的j,计算dp[i][j],如果i j位置没有..原创 2021-07-09 11:42:23 · 53 阅读 · 0 评论 -
leetcode62. 不同路径
题目描述:题解:当m=1 或n=1时,即网格形状为一排或一列,这种情况下,从起始位置一直向下或向右,只有一种可能路径。列出一个表格计算m n取不同值的可选路径数:可以发现一个规律:m n的可选路径数=m n-1可选路径数+m-1 n可选路径数利用动态规划求解,dp[i][j]保存网格i j的路径数1.将dp[0][j] dp[i][0]初始化为12.对小于m的每个i,小于n的每个j,计算dp[i][j]class Solution(object): d.原创 2021-07-09 10:24:44 · 60 阅读 · 0 评论