509. 斐波那契数
题解:代码随想录
状态:AC
思路
动态规划思路:
- 明确dp数组及下标i含义
- 确定递推公式:dp[i] = dp[i - 1] + dp[i - 2]
- 初始化dp数组
- 确定遍历顺序
- 举例推导dp数组
代码
时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
public int fib(int n) {
if(n < 2) return n;
int sum = 0;
int left = 0, right = 1;
for(int i = 2; i <= n; i++){
sum = left + right;
left = right;
right = sum;
}
return sum;
}
}
70. 爬楼梯
题解:代码随想录
状态:AC
思路
dp[i] = dp[i - 1] + dp[i - 2]
代码
时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
public int climbStairs(int n) {
if(n <= 2) return n;
int sum = 0;
int left = 1, right = 2;
for(int i = 3; i <= n; i++){
sum = left + right;
left = right;
right = sum;
}
return sum;
}
}
746. 使用最小花费爬楼梯
题目:746. 使用最小花费爬楼梯 - 力扣(LeetCode)
题解:代码随想录
状态:AC
思路
dp[i] = Math.min(cost[i - 2] + dp[i - 2], cost[i - 1] + dp[i - 1])
代码
时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
public int minCostClimbingStairs(int[] cost) {
int left = 0, right = 0;
int res = 0;
for (int i = 2; i <= cost.length; i++) {
int temp = Math.min(cost[i - 2] + left, cost[i - 1] + right);
left = right;
right = temp;
}
return right;
}
}
343. 整数拆分
题解:代码随想录
状态:需要多复习
思路
- dp[i]表示数字i的拆分结果,注意j<=i-j避免重复计算,例如:1,3 和 3,1
- j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘
- dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j * (i - j)))
代码
时间复杂度:O(n^2) 空间复杂度:O(N)
class Solution {
public int integerBreak(int n) {
int[] dp = new int[n + 1];
dp[2] = 1;
for(int i = 3; i <= n; i++){
for(int j = 1; j <= i - j; j++){
dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j * (i - j)));
}
}
return dp[n];
}
}