虽然这几天的任务是学习贪心算法,但是大多数能用动态规划的题我都用的动态规划解法。
122. 买卖股票的最佳时机 II
class Solution {
public int maxProfit(int[] prices) {
// dp[i][0]第i天持有股票后的最多现金
// dp[i][1]第i天持有的最多现金
int[][] dp = new int[prices.length][2];
dp[0][0] = - prices[0];
for(int i = 1; i < prices.length; i++){
dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] - prices[i]);
dp[i][1] = Math.max(dp[i-1][0] + prices[i], dp[i-1][1]);
}
return dp[prices.length - 1][1]; // 最后一天只能清仓
}
}
55. 跳跃游戏
class Solution {
public boolean canJump(int[] nums) {
int rightMost = nums[0];
for(int i = 0; i <= rightMost; i++){
rightMost = Math.max(rightMost, i + nums[i]);
if(rightMost >= nums.length - 1)return true;
}
return false;
}
}
45. 跳跃游戏 II
class Solution {
public int jump(int[] nums) {
// dp[i]表示到达索引i的最小跳跃次数
int[] dp = new int[nums.length];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for(int i = 1; i < nums.length; i++){
for(int j = 0; j < i; j++){
if(j + nums[j] >= i){
dp[i] = Math.min(dp[i], dp[j] + 1);
}
}
}
return dp[nums.length - 1];
}
}