Leetcode 动态规划
文章平均质量分 60
Leetcode 动态规划题目
努利!奋斗!
这个作者很懒,什么都没留下…
展开
-
828. Count Unique Characters of All Substrings of a Given String
leetcode原创 2022-08-02 10:50:01 · 207 阅读 · 1 评论 -
leetcode 926. Flip String to Monotone Increasing
leetcode原创 2022-08-01 04:14:23 · 252 阅读 · 0 评论 -
Leetcode 1567. Maximum Length of Subarray With Positive Product
leetcode原创 2022-07-28 13:04:36 · 125 阅读 · 0 评论 -
Leetcode 818. Race Car
leetcode原创 2022-07-13 12:39:03 · 307 阅读 · 0 评论 -
Leetcode 1048. Longest String Chain
leetcode原创 2022-07-05 04:26:29 · 145 阅读 · 0 评论 -
leetcode 1937. Maximum Number of Points with Cost
leetcode原创 2022-07-04 03:40:13 · 131 阅读 · 0 评论 -
Leetcode https://leetcode.com/problems/minimum-falling-path-sum/
leetcode原创 2022-07-04 03:26:59 · 62 阅读 · 0 评论 -
leetcode 2304. Minimum Path Cost in a Grid
leetcode原创 2022-06-23 12:45:39 · 123 阅读 · 0 评论 -
Leetcode 368. Largest Divisible Subset
题目解法:dp这道题目的关键在于想到一个subset在符合条件的情况下,如果另一个数字能够整除这个subset中最大的数字,证明这个数字能够被扩展到这个subset中,那么这就是一种子问题关系将数组排序,保证在数字的某个位置,当前数字的所有因数或者能整除的数都在这个数前面,这样我们才能用上面提到的子问题关系dp状态转移方程:dp[i] = max(dp[j] + 1 for j < i and nums[i]%nums[j]==0)同时由于需要返回最终的subset而不是长度,这边需要用原创 2022-05-11 14:03:21 · 320 阅读 · 0 评论 -
Leetcode 2266. Count Number of Texts
题目解法1:暴力recursion暴力recursion只能过一个test case,因为时间复杂度是O(2^n),n是数字串的长度class Solution {public: int dfs(string digits,unordered_map<char,string>& mapping){ if(digits.size() == 0) return 1; int res = 0; int i = 0;原创 2022-05-10 01:39:25 · 164 阅读 · 0 评论 -
Leetcode 2245. Maximum Trailing Zeros in a Cornered Path
题目解法:Weekly Contest 289的题目,自己感觉有点变态,当时没做出来这道题需要解决一下几个问题:如何数trailing zero如何枚举这些符合条件形状的所有可能性第一个问题最优解是,所有的0都只可能是2*5得到,所以可以把每个位置数字分解,记录每个数字以2为因子和以5为因子的个数。可以通过一个形状能组成多少个2,5的pair来得到多少个0。由于要累计这些个数,所以使用prefixsum技巧枚举这些形状可能性最好操作的方案是把每个位置作为形状的turning point,原创 2022-04-18 03:58:10 · 183 阅读 · 0 评论 -
Leetcode 1786. Number of Restricted Paths From First to Last Node
题目解析题目意思首先理解一下。就是说第一个节点和最后一个节点是1和n固定,返回符合要求的restricted path个数。这个restricted含义是,在path中离最后一个节点也就是n越远的节点,距离也必须越大。这里需要注意的是除了开始节点和结束节点固定之外,并没有要求path中的节点本身的数字必须要有顺序,只需要离最后一个节点的距离保持满足条件即可。所以解题分为两步:通过最短路径算法找到每个节点离最后一个节点的最短距离,这里采用dijkstra找出符合条件的节点到最后节点距离降序的路径个原创 2022-02-16 10:57:11 · 163 阅读 · 0 评论 -
Leetcode 1029. Two City Scheduling
题目解法解法1:贪心利用a-b的差值从小到大排序,前n个人去a,剩下的去b,利用的贪心思想。但是这个解法细想并没有非常令人信服的解释,起码我不能完全说服自己为什么这么做是对的class Solution: def twoCitySchedCost(self, costs: List[List[int]]) -> int: diff = [] n = len(costs) for i in range(n): di原创 2022-01-08 11:06:51 · 229 阅读 · 0 评论 -
leetcode 2087. Minimum Cost Homecoming of a Robot in a Grid
题目解法解法1:最短路径问题(TLE)bellman fordclass Solution: def minCost(self, startPos: List[int], homePos: List[int], rowCosts: List[int], colCosts: List[int]) -> int: m,n = len(rowCosts),len(colCosts) dists = [[float('inf')] * n for _ in r原创 2022-01-04 12:27:52 · 515 阅读 · 0 评论 -
Leetcode 62. Unique Paths (cpp)
题目解法:动态规划class Solution {public: int uniquePaths(int m, int n) { vector<vector<int>> dp(m,vector<int>(n,0)); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(i == 0 || j == 0){原创 2021-01-22 02:17:06 · 86 阅读 · 0 评论 -
Leetcode 1277. Count Square Submatrices with All Ones (python + cpp)
题目解法:动态规划其实这道题目跟221 maximum square. 那道题里面dp数组每个位置代表以这个位置作为右下角点的最大square的边长多大。而这边只需要把那个dp数组全部加起来就是答案了。因为dp每个位置的值代表以这个位置作为右下角的点的square有多少个python版本class Solution: def countSquares(self, matrix: List[List[int]]) -> int: m = len(matrix)原创 2021-01-06 09:03:46 · 439 阅读 · 0 评论 -
Leetcode 11. Container With Most Water (cpp)
题目解法:双指针假设现在考虑left位置和right位置的bar形成的区域,这个时候储存的水量由两边中高度小的决定,那么很显然要获得比现在更大的储存量,只有可能移动小的那边。移动大的那边只会让答案变小class Solution {public: int maxArea(vector<int>& height) { if(height.empty()){ return 0; } int l = 0,原创 2021-01-03 08:43:23 · 209 阅读 · 0 评论 -
Leetcode 5. Longest Palindromic Substring (python)
题目解法1:动态规划这边的动态规划需要注意两个点:长度为1和2的需要单独判断二维dp中的一维代表开始,二维代表长度。如果一维代表开始,一维代表结束的话,没有办法保证子问题已经被计算class Solution: def longestPalindrome(self, s: str) -> str: if not s: return '' n = len(s) dp = [[False]*n原创 2020-12-25 03:26:44 · 609 阅读 · 0 评论 -
Leetcode 42. Trapping Rain Water (cpp)
题目解法1:暴力这题关键在于,每个位置能盛放多少水由这个位置左边的最大值和右边的最大值中的最小值决定的。到每个位置也只需要计算当前位置能盛放多少水即可。知道了这点,剩下的就是怎么优化罢了,原理都一样class Solution {public: int trap(vector<int>& height) { int n=height.size(); int ans = 0; for (int i=0;i<n;i++)原创 2020-12-23 10:20:53 · 144 阅读 · 0 评论 -
Leetcode 1696. Jump Game VI (python)
题目解法1:暴力dp(TLE)class Solution: def maxResult(self, nums: List[int], k: int) -> int: if not nums: return 0 dp = [float(-inf)]*len(nums) dp[0] = nums[0] for i in range(len(nums)):原创 2020-12-22 12:20:25 · 895 阅读 · 0 评论 -
Leetcode 329. Longest Increasing Path in a Matrix (python+cpp)
题目解法1:dfs暴力class Solution: def longestIncreasingPath(self, matrix: List[List[int]]) -> int: def dfs(i,j,prev): if i<0 or i>=m or j<0 or j>=n or matrix[i][j]<=prev: return 0 #print(i,j原创 2020-12-18 06:21:44 · 387 阅读 · 0 评论 -
Leetcode 1690. Stone Game VII (python)
题目解法:区间dp这是道经典的区间动态规划解决博弈问题。关键在于理解Alice和Bob的两种策略反应到dp的决策实际上是一样的class Solution: def stoneGameVII(self, stones: List[int]) -> int: def dfs(l,r): if l==r: return 0 if memo[l][r]: retur原创 2020-12-14 09:26:06 · 253 阅读 · 0 评论 -
Leetcode wordbreak类型的序列问题
题目1:139. Word Break解法1:暴力backtrackingclass Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: def backtracking(start): nonlocal ans if start == len(s): ans = True原创 2020-12-05 05:48:25 · 206 阅读 · 0 评论 -
Leetcode 1504. Count Submatrices With All Ones (python)
题目解法1:枚举上下边界,将二维问题转化为1维vector的情况来做class Solution: def numSubmat(self, mat: List[List[int]]) -> int: m,n = len(mat),len(mat[0]) partial_sum = [[0]*n for _ in range(m+1)] for i in range(n): tmp = 0原创 2020-11-11 03:33:29 · 283 阅读 · 0 评论 -
Leetcode 44. Wildcard Matching & Regular Expression Matching (python)
Leetcode 44. Wildcard Matching解法:动态规划这道题目在于理解代码中的step2和step4的第一部分关于step 4的第一步份,实际上可以用0,1背包跟完全背包之前的关系来理解class Solution {public: bool isMatch(string s, string p) { int sl = s.length(); int pl = p.length(); // step1:原创 2020-10-29 13:48:23 · 134 阅读 · 0 评论 -
Leetcode 1626. Best Team With No Conflicts (python)
Leetcode 1626. Best Team With No Conflicts题目解析:题目解析:对于这种由多个维度的题目,应该基本都是先对一个维度进行一些处理,比如排序,然后再看一个维度固定的情况下,另一个维度上看问题简化成了什么。或者说这个问题是由什么问题包装而来的这道题目将age进行排序之后,会发现问题简化成了求max sum of non-decreasing sub-sequence。与Leetcode 300. Longest Increasing Subsequence几乎是一原创 2020-10-19 14:00:03 · 376 阅读 · 0 评论 -
Leetcode 152&1594 maximum product (python)
Leetcode 152. Maximum Product Subarray解法:同时储存最大的正值和最小的负值,下一个最大值一定会在跟这两个的乘积中出现class Solution(object): def maxProduct(self, nums): """ :type nums: List[int] :rtype: int """ if not nums: return 0原创 2020-10-12 07:38:49 · 108 阅读 · 0 评论 -
Leetcode 1478. Allocate Mailboxes (python)
Leetcode 1478. Allocate Mailboxes题目解法:follow up题目解法:首先一定要有这种思想就是他求的是mincost这个值,所以应该往动态规划上去想。而且这个问题的动态规划肯定是二维的,这张基本思想要有。这里的动态规划也是从放置的最后一个mailbox出发来想,当最后一个mailbox放置的位置定了之后,那么最终的cost就是放置最后一个mailbox造成的cost和前面的相应的子问题造成的cost。也就是说我们要求解的是最后一个mailbox覆盖若干个house原创 2020-10-07 10:53:18 · 252 阅读 · 0 评论 -
Leetcode 140. Word Break II (python+cpp)
Leetcode 140. Word Break II题目解法1:动态规划+暴力递归解法2:recursion+memorization总结题目解法1:动态规划+暴力递归首先用word break I的方法来判断是否能够拆分能拆分之后,暴力recursion解出所有答案class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> List[str]: def check(s):原创 2020-09-30 09:46:13 · 389 阅读 · 0 评论 -
Leetcode 1235. Maximum Profit in Job Scheduling (python)
Leetcode 1235. Maximum Profit in Job Scheduling题目解法1:dp解法2:dp+binary search题目解法1:dp这倒题目用dp来做是挺明显的,但是dp的元素代表什么很关键。如果dp元素代表时间的话,那这个题目就很难做了。正确的做法应该是用区间来代表dp的元素,这样就变成了对于每个元素取或者不取两种情况了。具体的解法如下:将各个区间按照结尾进行排序dp[i]代表从前i个区间中选择,最多可以获取多大的利润对于第i个区间,分取和不取两种情况如原创 2020-09-25 08:06:05 · 1417 阅读 · 0 评论 -
Leetcode 132. Palindrome Partitioning II (python+cpp)
Leetcode 132. Palindrome Partitioning II题目解法1:backtracking暴力解法(TLE)解法2:O(N^3)动态规划解法3:O(N^2)动态规划题目解法1:backtracking暴力解法(TLE)class Solution: def minCut(self, s: str) -> int: def helper(i,count): nonlocal ans if i==le原创 2020-09-16 13:30:37 · 240 阅读 · 0 评论 -
Leetcode stock买卖问题集合
Leetcode stock买卖问题集合题目1:解法:题目2:解法:动态规划题目1:解法:因为卖必须发生在买之后,所以用一个变量来储存当前位置之前的数字中的最小值,而另一个变量储存当前卖掉可以获得的最大值class Solution: def maxProfit(self, prices: List[int]) -> int: n = len(prices) min_buy = float('inf') max_profit = 0原创 2020-09-16 13:30:15 · 246 阅读 · 1 评论 -
完全背包和0,1背包的差别
完全背包与0,1背包的差别完全背包与0,1背包的唯一差别在于物品是否能被复用。两种题目实现的差别也非常非常小。举例说明:nums=[1,2,3,4,5],target=11,求用nums中任意个数字是否能组成target。0,1背包情况:每个数字只能被用一次状态转移方程:dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i]]dp[i][j]代表只用前i个数字的情况下是否能组成j完全背包情况:每个数字可以被用无限次状态转移方程:dp[i][j] = dp[i-1]原创 2020-09-08 13:20:39 · 2535 阅读 · 2 评论 -
264. Ugly Number II (python+cpp)
Leetcode 264. Ugly Number II题目解法1:brutal force(TLE)改进的思路:解法2:heap解法3:三指针法题目解法1:brutal force(TLE)一个个判断每个数字是否uglyclass Solution: def nthUglyNumber(self, n: int) -> int: def isugly(num): if num == 0: return Fals原创 2020-08-25 14:30:35 · 275 阅读 · 0 评论 -
Leetcode 256. Paint House (python+cpp)
Leetcode 256. Paint House题目解法1:brutal force解法2:recursion解法3:memorization+recursion解法4:bottom-up动态规划题目解法1:brutal force暴力解法就是产生所有组合,选取最小的。时间复杂度会是3的n次解法2:recursion使用recursion其实是bottom-up的解法。在这边会超时,但是这里的recursion其实已经解释了动态规划应该怎么做class Solution: def m原创 2020-08-17 13:43:17 · 282 阅读 · 0 评论 -
Leetcode152 Maximum Product Subarray python
Leetcode152 Maximum Product Subarray题目解法1:brutal force解法2:同时记录最小和最大值解法3:分类讨论解法4:双向动规题目Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which...原创 2019-12-26 03:55:28 · 142 阅读 · 0 评论 -
leetcode 438. Find All Anagrams in a String (python+cpp)
leetcode 438. Find All Anagrams in a String题目解法1:使用counter函数解法2:滑窗+动态更新hashmap题目Given a string s and a non-empty string p, find all the start indices of p’s anagrams in s.Strings consists of lowerca...原创 2019-12-29 02:19:19 · 126 阅读 · 0 评论 -
Leetcode 239. Sliding Window Maximum(python)
Leetcode 239. Sliding Window Maximum题目解法1:brutal force解法2:利用单调递减双向队列解法3:动态规划,构建左右最大数组题目Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the...原创 2020-01-02 08:09:23 · 345 阅读 · 0 评论 -
Leetcode 337. House Robber III(python+cpp)
Leetcode 337. House Robber III题目错误解法正确解法:递归+动态规划题目The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the “root.” Besides the root, each h...原创 2020-01-04 07:44:23 · 301 阅读 · 0 评论 -
Leetcode 416. Partition Equal Subset Sum
Leetcode 416. Partition Equal Subset Sum题目解析:解法1:DFS(TLE)解法2:二维dfs解法3:二维dp解法4:一维dp题目Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets s...原创 2020-01-06 01:14:42 · 181 阅读 · 0 评论