
动态规划
枫流仁武
这个作者很懒,什么都没留下…
展开
-
LeetCode 115 不同的子序列
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE"是"ABCDE"的一个子序列,而"AEC"不是)题目数据保证答案符合 32 位带符号整数范围。示例1:输入:s = "rabbbit", t = "rabbit"输出:3解释:如下图所示, 有 3 种可以从 s 中得到 "rabbit" 的方案。(上箭头符号 ^ 表示选...原创 2021-03-17 08:15:18 · 116 阅读 · 0 评论 -
LeetCode 132 分割字符串2
给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文。返回符合要求的最少分割次数。示例 1:输入:s = "aab"输出:1解释:只需一次分割就可将s 分割成 ["aa","b"] 这样两个回文子串。示例 2:输入:s = "a"输出:0示例 3:输入:s = "ab"输出:1这个需要用到两次动态规划,第二次没有必要搭建二维数组。一位数组够用了,可以减小时间复杂度。from typing import *import sys...原创 2021-03-08 08:24:05 · 170 阅读 · 0 评论 -
LeetCode 354 俄罗斯套娃信封问题
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。注意:不允许旋转信封。示例 1:输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]输出:3解释:最多信封的个数为 3, 组合为:.原创 2021-03-05 19:19:47 · 171 阅读 · 0 评论 -
LeetCode 416 分割等和子集
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例2:输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子集.这道题是套了个包装的01背包问题,解决方法:from typing import..原创 2021-03-01 19:02:05 · 109 阅读 · 0 评论 -
LeetCode 940 不同的子序列2
给定一个字符串S,计算S的不同非空子序列的个数。因为结果可能很大,所以返回答案模 10^9 + 7.示例 1:输入:"abc"输出:7解释:7 个不同的子序列分别是 "a", "b", "c", "ab", "ac", "bc", 以及 "abc"。示例 2:输入:"aba"输出:6解释:6 个不同的子序列分别是 "a", "b", "ab", "ba", "aa" 以及 "aba"。示例 3:输入:"aaa"输出:3解释:3 个不同的子序列分别是 "a", ...原创 2021-02-23 10:55:29 · 129 阅读 · 0 评论 -
LeetCode 264 丑数2
编写一个程序,找出第n个丑数。丑数就是质因数只包含2, 3, 5的正整数。两种方法,堆和动态规划动态规划:class Solution: def nthUglyNumber(self, n: int) -> int: i2, i3, i5 = 0, 0, 0 arr = [1] for j in range(1, n): val = min(arr[i2] * 2, arr[i3] * 3, ar...原创 2021-01-23 18:58:10 · 84 阅读 · 0 评论 -
LeetCode 375 猜数字大小2
375. 猜数字大小 II难度中等227我们正在玩一个猜数游戏,游戏规则如下:我从1到n之间选择一个数字,你来猜我选了哪个数字。每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了。然而,当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。直到你猜到我选的数字,你才算赢得了这个游戏。class Solution: def getMoneyAmount(self, n: int) -> int: dp = [[0] * (n +...原创 2021-01-15 19:17:33 · 100 阅读 · 0 评论 -
leetCode 714 买卖股票的最佳时机含手续费
给定一个整数数组prices,其中第i个元素代表了第i天的股票价格 ;非负整数fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。示例 1:输入: prices = [1, 3, 2, 8, 4, 9], fee = 2输出: 8解释: 能够达到的最大利润: 在此...原创 2020-12-17 09:02:26 · 78 阅读 · 0 评论 -
LeetCode 1092 最短公共超序列
给出两个字符串str1 和str2,返回同时以str1和str2作为子序列的最短字符串。如果答案不止一个,则可以返回满足条件的任意一个答案。(如果从字符串 T 中删除一些字符(也可能不删除,并且选出的这些字符可以位于 T 中的任意位置),可以得到字符串 S,那么S 就是T 的子序列)from typing import *from collections import defaultdictclass Solution: def shortestCommonSup...原创 2020-10-27 09:02:25 · 600 阅读 · 0 评论 -
LeetCode 834 树中距离之和
给定一个无向、连通的树。树中有 N 个标记为 0...N-1 的节点以及 N-1条边。第 i 条边连接节点edges[i][0] 和 edges[i][1]。返回一个表示节点 i 与其他所有节点距离之和的列表 ans。参考标准解析:链接写的答案。from typing import *class Solution: def __init__(self): self.ans = None self.num_nodes = None ...原创 2020-10-06 12:11:33 · 167 阅读 · 0 评论 -
LeetCode 72 编辑距离
给你两个单词word1 和word2,请你计算出将word1转换成word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符class Solution { public int minDistance(String word1, String word2) { int len1=word1.length(); int len2=word2.length(); ...原创 2020-10-01 09:51:12 · 130 阅读 · 0 评论 -
LeetCode 08.11 硬币
硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)class Solution: def waysToChange(self, n: int) -> int: dp = [0] * (n + 1) dp[0] = 1 for coin in {1, 5, 10, 25}: # 为了避免重复,一次首先使用一种找零方式原创 2020-10-01 09:45:49 · 95 阅读 · 0 评论 -
LeetCode 877 石子游戏
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子piles[i]。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回true,当李赢得比赛时返回false。class Solution: def stoneGame(sel...原创 2020-10-01 08:57:18 · 105 阅读 · 0 评论 -
正则表达式匹配
给你一个字符串s和一个字符规律p,请你来实现一个支持 '.'和'*'的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。from collections import defaultdictclass Solution: def __init__(self): self.dp = defaultdict(lambda: -1) def isMatch(sel...原创 2020-09-29 19:38:04 · 63 阅读 · 0 评论 -
LeetCode 983 最低票价
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为days的数组给出。每一项是一个从1到365的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为costs[0] 美元;一张为期七天的通行证售价为costs[1] 美元;一张为期三十天的通行证售价为costs[2] 美元。通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 ...原创 2020-09-24 20:06:40 · 175 阅读 · 0 评论 -
LeetCode 343 整数拆分
给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。这里只给出利用动态规划的最简单的解法:class Solution: def integerBreak(self, n: int) -> int: dp=[0]*(n+1) for i in range(2,n+1): for j in range(i): dp[i]=max(dp[i],j*.原创 2020-09-22 14:15:36 · 67 阅读 · 0 评论 -
LeetCode 312 戳气球
有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组nums中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得nums[left] * nums[i] * nums[right]个硬币。这里的left和right代表和i相邻的两个气球的序号。注意当你戳破了气球 i 后,气球left和气球right就变成了相邻的气球。求所能获得硬币的最大数量。说明:你可以假设nums[-1] = nums[n] = 1,但注意它们不是真实...原创 2020-09-19 15:21:27 · 100 阅读 · 0 评论 -
LeetCode 面试题08.14 布尔运算
给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成。实现一个函数,算出有几种可使该表达式得出 result 值的括号方法。from collections import defaultdictclass Solution: def __init__(self): """ 三维动态规划就不用数组了,从上到下进行递归运算 .原创 2020-09-19 14:54:53 · 498 阅读 · 0 评论 -
LeetCode 647 回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:"abc"输出:3解释:三个回文子串: "a", "b", "c"示例 2:输入:"aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"首先是无脑动态规划:class Solution: def countSubstrings(self, s: str) -&g原创 2020-09-16 08:56:45 · 206 阅读 · 0 评论 -
LeetCode 139 单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。from typing import *class TrieTree: def __init__(self): self.head = Node('#') def add(self, word): tem = self.head .原创 2020-09-15 19:45:47 · 108 阅读 · 0 评论 -
LeetCode 97 交错字符串
给定三个字符串s1, s2, s3, 验证s3是否是由s1和s2 交错组成的。示例 1:输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"输出:true示例2:输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"输出:falseclass Solution: def isInterleave(self, s1: str, s2: str, s3: str) ->...原创 2020-09-15 16:27:08 · 105 阅读 · 0 评论 -
LeetCode 120 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为11(即,2+3+5+1= 11)。本题很容易,但是注意空间复杂度可以优化到O(N)。class Solution: def minimum...原创 2020-09-15 10:43:58 · 81 阅读 · 0 评论 -
LeetCode 面试46 把数字翻译成字符串
本题可以使用搜索完成,但是动态规划更快更好。动态规划空间复杂度可以缩小。class Solution: def translateNum(self, num: int) -> int: """ 不要首先考虑搜索,动态规划更好用 :param num: :return: """ p, q = 1, 1 num_str = str(num) for i in r原创 2020-09-10 08:06:10 · 85 阅读 · 0 评论 -
LeetCode 17.13 恢复空格
该题为动态规划和字典树混合应用的题目。定义dp数组,下表为i代表到第i个位置最少的未识别字符数量。由于在处理dp数组第i个位置时,需要从后向前寻找匹配的单词,因此字典树中插入为倒序插入。from typing import *class Node(): def __init__(self, c): self.c = c self.next = {} self.isEnd = Falseclass Trie(): def原创 2020-09-09 21:13:54 · 150 阅读 · 0 评论 -
LeetCode 44 通配符匹配
class Solution: def __init__(self): self.dp= {} def isMatch(self, s: str, p: str) -> bool: return self.helper(s,p,0,0) def helper(self,s,p,i,j): if (i,j) in self.dp: return self.dp[i,j] if j==len.原创 2020-07-05 08:10:23 · 76 阅读 · 0 评论 -
布尔运算
给定一个布尔表达式和期待的结果,找到得到对应结果的可能个数。class Solution: def countEval(self, s: str, result: int) -> int: if len(s)==0: return 0 n=len(s) dp=[[[-1,-1] for _ in range(n)] for _ in range(n)] return self.rec(s,dp,0原创 2020-07-02 17:53:06 · 300 阅读 · 0 评论 -
LeetCode 546 移除盒子
三重动态规划from typing import *from collections import defaultdictclass Solution: def __init__(self): self.dic=defaultdict(int) def removeBoxes(self, boxes: List[int]) -> int: return self.helper(boxes,0,len(boxes)-1,0) def h原创 2020-07-02 17:23:59 · 118 阅读 · 0 评论 -
LeetCode 124 二叉树中的最大路径和
给定一棵非空二叉树,返回其最大路径和,路径为从任意节点出发,到达任意节点的序列,至少包含一个节点。本道题中路径可能弯折,因此首先要简化,考虑从某个节点往下搜索,路径和是多少,在考虑跨越该节点,最大路径和是多少。class Solution: def __init__(self): self.max_val=-sys.maxsize def maxPathSum(self, root: TreeNode) -> int: self.help原创 2020-06-21 15:36:57 · 141 阅读 · 0 评论 -
LeetCode 10 正则表达式匹配
动态规划from collections import defaultdictclass Solution: def __init__(self): self.dp= defaultdict(lambda :-1) def isMatch(self, s: str, p: str) -> bool: len1,len2=len(s),len(p) return self.helper(0,0,s,p)==1 def h原创 2020-06-20 08:43:03 · 88 阅读 · 0 评论 -
LeetCode 115 不同的子序列
class Solution: def numDistinct(self, s: str, t: str) -> int: len1,len2=len(s),len(t) dp=[[0]*(len2+1)for _ in range(len1+1)] for i in range(len1+1): dp[i][0]=1 for i in range(1,len1+1): for...原创 2020-06-15 15:03:10 · 108 阅读 · 0 评论 -
LeetCode 152 乘积最大子数组
动态规划典型题目,保留最大值和最小值。import sysclass Solution: def maxProduct(self, nums: List[int]) -> int: if len(nums)==0: return 0 max_val=-sys.maxsize tem_max,tem_min=1,1#以当前值为结尾的数组的最大和 for val in nums:原创 2020-06-14 20:20:51 · 107 阅读 · 0 评论 -
PAT 1040 Longest Symmetric String
Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, givenIs PAT&TAP symmetric?, the longest symmetric sub-string iss PAT&TAP s, hence you ...原创 2019-08-31 15:51:30 · 84 阅读 · 0 评论 -
PAT 1046 Shortest Distance
The task is really simple: givenNexits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.Input Specification:Each input file conta...原创 2019-08-26 18:49:54 · 73 阅读 · 0 评论 -
PAT 1007
Given a sequence ofKintegers {N1,N2, ...,NK}. A continuous subsequence is defined to be {Ni,Ni+1, ...,Nj} where1≤i≤j≤K. The Maximum Subsequence is the continuous subsequen...原创 2019-07-14 16:59:08 · 72 阅读 · 0 评论 -
PAT 1045 Favorite Color Stripe
Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in her favorite order by cutting off those unwanted pieces and sewing the remaining parts...原创 2019-06-10 17:55:37 · 110 阅读 · 0 评论 -
leetcode 279:Perfect Squares 解题报告
问题描述:Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.思路:给定一个正整数n,将其拆分成多个完全平方数之和的形式。本题类似于硬币找零问题,给出代码如下:/** * 给出一个整数n...原创 2018-07-18 11:06:31 · 160 阅读 · 0 评论