代码随想三刷动态规划篇7
- [198. 打家劫舍](#198. 打家劫舍)
- [213. 打家劫舍 II](#213. 打家劫舍 II)
- [337. 打家劫舍 III](#337. 打家劫舍 III)
- [121. 买卖股票的最佳时机](#121. 买卖股票的最佳时机)
198. 打家劫舍
题目
代码
java
class Solution {
public int rob(int[] nums) {
if(nums.length==1){
return nums[0];
}
if(nums.length==2){
return Math.max(nums[0],nums[1]);
}
int[] dp = new int[nums.length];
dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
for(int i=2;i<nums.length;i++){
dp[i]= Math.max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[nums.length-1];
}
}
213. 打家劫舍 II
题目
代码
java
class Solution {
public int rob(int[] nums) {
if(nums.length==1){
return nums[0];
}
if(nums.length==2){
return Math.max(nums[0],nums[1]);
}
int[] dpLeft = new int[nums.length];//不偷最后一个
int[] dpRight = new int[nums.length];//不偷第一个
dpLeft[0] = nums[0];
dpLeft[1] = Math.max(nums[0],nums[1]);
dpRight[1] = nums[1];
if(nums.length>=3){
dpRight[2] = Math.max(nums[1],nums[2]);
}
for(int i =2;i<nums.length-1;i++){//不偷最后一个
dpLeft[i] = Math.max(dpLeft[i-1],dpLeft[i-2]+nums[i]);
}
for(int i =3;i<nums.length;i++){//不偷前一个
dpRight[i] = Math.max(dpRight[i-1],dpRight[i-2]+nums[i]);
}
return Math.max(dpLeft[nums.length-2],dpRight[nums.length-1]);
}
}
337. 打家劫舍 III
题目
代码
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
Map<TreeNode,Integer> map = new HashMap();
public int rob(TreeNode root) {
if(root==null){
return 0;
}
if(map.containsKey(root)){
return map.get(root);
}
int money = root.val;
if(root.left!=null){
money+=rob(root.left.left)+rob(root.left.right);
}
if(root.right!=null){
money+=rob(root.right.left)+rob(root.right.right);
}
int res = Math.max(money,rob(root.left)+rob(root.right));
map.put(root,res);
return res;
}
}
121. 买卖股票的最佳时机
题目
代码
java
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][2];
dp[0][0] = 0;
dp[0][1] = -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][1],-prices[i]);
}
return dp[prices.length-1][0];
}
}