动态规划
文章平均质量分 57
Taohongfei_huster
这个作者很懒,什么都没留下…
展开
-
121.Best Time to Buy and Sell Stock&&122&&123&&188
只能进行一次交易,当进行到第i天时,该天进行交易的话,最大利润为nums[i]-min{nums[j]},其中0<=j<=i-1.程序如下: class Solution { public int maxProfit(int[] prices) { if(prices.length == 0) return 0; int...原创 2018-09-17 18:42:51 · 113 阅读 · 0 评论 -
494. Target Sum
题目意思很明确,最简单的是暴力法,对于每个元素nums[i],考虑+nums[i]和-nums[i]两种情况: public class Solution { int count = 0; public int findTargetSumWays(int[] nums, int S) { calculate(nums, 0, 0, S); ...原创 2018-12-21 17:17:34 · 116 阅读 · 0 评论 -
62. Unique Paths&&63. Unique Paths II
动态规划轻松解决:grid[i][j]为到达(i,j)处的方案数,则:grid[i][j]=grid[i-1][j]+grid[i][j-1].。 public class Solution { public int uniquePaths(int m, int n) { int[][] grid = new int[m][n]; for(int i = 0; i&l...原创 2018-12-03 21:30:52 · 106 阅读 · 0 评论 -
300. Longest Increasing Subsequence
暴力法: 采用递归,如果当前元素大于pre,则序列中包含当前元素,长度加1,如果小于等于pre,考虑下一个元素,结果返回两种情况的最大值。 public class Solution { public int lengthOfLIS(int[] nums) { return lengthofLIS(nums, Integer.MIN_VALUE, 0); ...原创 2018-12-03 20:41:53 · 119 阅读 · 0 评论 -
322. Coin Change
最直观的是暴力法,遍历coins,每一个面额的最大数目xi=amount\si,遍历每一种可能,找出数目最少的那一种。 class Solution { public int coinChange(int[] coins, int amount) { return coinChange(0, coins, amount); } privat...原创 2018-12-08 20:25:11 · 158 阅读 · 0 评论 -
416. Partition Equal Subset Sum
题目就是要从数组中找一个序列,使他们的和为sum/2。如果暴力硬解,挑选的数组子序列个数不定,复杂度太高,肯定不可取。事实上这是一个01背包问题,对于每个数字,要么选中要么不选中。 具体的,用一个二维数组d[i][j]表示,从前i个元素中挑选子序列是否可以计算出和j。那么我们只要知道当j=sum/2的时候,d[i][j]是否为true。 d[i][j]结果的得出,可以有两种情况 1.d[...原创 2018-12-12 15:46:12 · 222 阅读 · 0 评论 -
309. Best Time to Buy and Sell Stock with Cooldown
首先申明一下,这个思路并不是我想出来的,只是在LeetCode上看到有人这样解,觉得这个思路很不错,所以写下来作为分享和记录。 1.方法1 从题目中可以看出,不管哪一天,都只能是 buy 或者 sell 或者 cooldown(rest) 三种状态中的一种,而根据题目的约束条件,我们可以画出下图所示的状态图: 由此图我们可以得到: s0[i] = m...原创 2018-12-04 20:21:03 · 206 阅读 · 0 评论 -
279. Perfect Squares
任意一个数x,都能表示为 x = a + b*b(即使x本身就是个完全平方数),因此求解x的最少完全平方数缩小为求解a的最少完全平方数,即求“最优子结构”,典型的动态规划思想。dp[i]表示i的最小完全平方因子个数,且dp[i]=min{dp[i],dp[i-1]+1,dp[i-4]+1,dp[i-9]+1....dp[1]+1}. 那么,对于数组中的i,有如下可能: 1.如果 i=0,...原创 2018-11-29 18:13:29 · 134 阅读 · 0 评论 -
139. Word Break
采用动态规划,dp[i]表示substring(0,i+1)是否可以分解,i每增加1,如果存在0<=j<i,满足substring(i,j+1)可以分解,substring(j,n)存在,则dp[i+1]为true。 class Solution { public boolean wordBreak(String s, List<String> wordD...原创 2018-11-26 15:18:12 · 78 阅读 · 0 评论 -
221. Maximal Square
暴力法就不说了,直接讲用动态规划,设dp[i][j]为右下方节点为index[i][j]的最大方块的边长,则: 1.i=0,dp[0][j]=index[0][j]; 2.j=0,dp[i][0]=index[i]][0]; 3.if index[i][j]=0,dp[i][j]=0,else: dp[i][j]=min(dp[i][j-1],dp[i-1][j],dp[i-1][j-...原创 2018-11-22 16:40:59 · 89 阅读 · 0 评论 -
241. Different Ways to Add Parentheses
运算符将字符串分成了运算符左边和右边两部分,而每部分是原问题更小的子问题。每部分会产生一个运算结果集合,最终运算结果由左右两部分结果集合通过中间的运算符计算得到。 class Solution { public List<Integer> diffWaysToCompute(String input) { List<Integer> ret ...原创 2018-11-19 15:58:07 · 97 阅读 · 0 评论 -
198.House Robber&&213.House Robber&&337. House Robber III
利用动态规划,记dp[i]为走到第i间房屋时所抢的钱数的最大值,对于第i间房,有抢和不抢两种方案,取决于哪种选择获益最大,所以dp[i]=max{dp[i-1],dp[i-2]+nums[i]}. public class Solution { // O(n)空间的写法 public int rob1(int[] num) { if (num.length ...原创 2018-11-06 17:21:57 · 105 阅读 · 0 评论 -
53. Maximum Subarray
下面介绍动态规划的做法,复杂度为 O(n)。 步骤 1:令状态 dp[i] 表示以 A[i] 作为末尾的连续序列的最大和(这里是说 A[i] 必须作为连续序列的末尾)。 步骤 2:做如下考虑:因为 dp[i] 要求是必须以 A[i] 结尾的连续序列,那么只有两种情况: 这个最大和的连续序列只有一个元素,即以 A[i] 开始,以 A[i] 结尾。 这个最大和的连续序列有...原创 2018-10-11 16:50:19 · 81 阅读 · 0 评论 -
5. Longest Palindromic Substring&&647. Palindromic Substrings
诚然,不言暴力法。动态规划和中心扩展法较为合适。 class Solution { public String longestPalindrome(String s) { int n = s.length(); String res = ""; boolean[][] dp = new boolean[n][n]; for (int i =n; ...原创 2018-12-27 20:20:27 · 128 阅读 · 0 评论