![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Dynamic Programming
动态规划类型的题目
USC_ECE
这个作者很懒,什么都没留下…
展开
-
JZ30 连续子数组的最大和
这是很经典的动态规划题:public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int ans = array[0]; int prev = array[0]; for(int i = 1; i < array.length; i++){ int curr = array[i]; if(prev原创 2020-09-07 00:02:33 · 80 阅读 · 0 评论 -
JZ10 矩形覆盖
依旧是斐波那契数列2*n的大矩形,和n个2*1的小矩形其中target*2为大矩阵的大小有以下几种情形:target <= 0 大矩形为<= 2*0,直接return 1; target = 1大矩形为2*1,只有一种摆放方法,return1; target = 2 大矩形为2*2,有两种摆放方法,return2; target = n 分为两步考虑: 第一次摆放一块 2*1 的小矩阵,则摆放方法总共为f(n-1) ✔ ✔...原创 2020-08-27 11:26:05 · 90 阅读 · 0 评论 -
JZ9 变态跳台阶
因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级:跳1级,剩下n-1级,则剩下跳法是f(n-1);跳2级,剩下n-2级,则剩下跳法是f(n-2);跳n-1级,剩下1级,则剩下跳法是f(1);还有1种跳法就是直接一口气跳n级。所以f(n)=f(n-1)+f(n-2)+...+f(1)+1;因为f(n-1)=f(n-2)+f(n-3)+...+f(1)+1;所以f(n)=2*f(n-1)。public class Solution { public int JumpFloor原创 2020-08-27 11:01:20 · 217 阅读 · 0 评论 -
LeetCode 55. Jump Game
这道题可以用贪心算法也可以用动态规划。老师说虽然动态规划的解法时间复杂度更高,但更具有普遍性。代码如下:class Solution { public boolean canJump(int[] nums) { int n = nums.length; if(n == 1){ return true; } boolean[] dp = new boolean[n]; dp[n - 1] =原创 2020-08-08 07:37:56 · 101 阅读 · 0 评论 -
LeetCode 119. Pascal‘s Triangle II
这道题需要注意的是每次循环在List头部插入1,其效果就是将上一次循环计算出来的List整体向后平移1位。然后使用set方法,将List的第 j 位设置成 List.get(j) + List.get(j + 1)的值,也就是在Pascal三角中自己上方的两个元素。因为之前的List已经整体平移过1个单位,所以是j & j + 1。代码如下:class Solution { public List<Integer> getRow(int rowIndex) {原创 2020-08-08 06:56:49 · 117 阅读 · 0 评论 -
LeetCode 118. Pascal‘s Triangle
这道题需要注意的是index越界问题。代码如下:class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> res = new ArrayList<>(); for(int row = 0; row < numRows; row++){ List<Int原创 2020-08-07 15:38:39 · 75 阅读 · 0 评论 -
JZ7 斐波那契数列
public class Solution { public int Fibonacci(int n) { if(n == 0){ return 0; }else if(n == 1){ return 1; } int prev = 0, curr = 1; for(int i = 2; i <= n; i++){ curr += prev;.原创 2020-07-26 09:52:39 · 86 阅读 · 0 评论 -
LeetCode 91. Decode Ways
Approach 1 Recursionclass Solution { public int numDecodings(String s) { return helper(s, 0); } private int helper(String s, int start){ if(start == s.length()){ return 1; } if(s.charAt(start) == '原创 2020-07-19 13:00:02 · 89 阅读 · 0 评论 -
LeetCode 5. Longest Palindromic Substring
第 1 步:定义状态dp[i][j] 表示子串 s[i..j] 是否为回文子串,这里子串 s[i..j] 定义为左闭右闭区间,可以取到 s[i] 和 s[j]。第 2 步:思考状态转移方程在这一步分类讨论(根据头尾字符是否相等),根据上面的分析得到:dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]说明:「动态规划」事实上是在填一张二维表格,由于构成子串,因此 i 和 j 的关系是 i <= j ,因此,只需要填这张表格对角线以上的部分。看到 dp原创 2020-07-19 07:07:59 · 203 阅读 · 0 评论 -
LeetCode 300. Longest Increasing Subsequence
Dynamic Programming Time Complexity = O(n^2), Space Complexity = O(n). 由于这个最长上升序列不一定是连续的,对于每一个新加入的数,都有可能跟前面的序列构成一个较长的上升序列,或者跟后面的序列构成一个较长的上升序列。比如1,3,5,2,8,4,6,对于6来说,可以构成1,3,5,6,也可以构成2,4,6。因为前面那个序列长为4,后面的长为3,所以我们更愿意6组成那个长为4的序列,所以对于6来说,它组成序列的长度,实际上是之前最长一个升.原创 2020-06-07 12:48:16 · 93 阅读 · 0 评论