337. 打家劫舍 III(中等)
// 思路:维护两个集合,对于每一个节点都有选和不选两种可能,选与不选的结果会被父亲节点使用
class Solution {
Map<TreeNode,Integer> f = new HashMap<>();
Map<TreeNode,Integer> g = new HashMap<>();
public int rob(TreeNode root) {
dfs(root);
return Math.max(f.get(root),g.get(root));
}
public void dfs(TreeNode node){
if(node==null)return;
dfs(node.left);
dfs(node.right);
f.put(node,node.val+g.getOrDefault(node.left,0)+g.getOrDefault(node.right,0));
g.put(node,Math.max(f.getOrDefault(node.left,0),g.getOrDefault(node.left,0))+Math.max(f.getOrDefault(node.right,0),g.getOrDefault(node.right,0)));
}
}
121. 买卖股票的最佳时机(简单)
class Solution {
public int maxProfit(int[] prices) {
int max = 0;
int in = prices[0];
for(int i=1;i<prices.length;i++){
if(prices[i]<in)in = prices[i];
max = Math.max(max,prices[i]-in);
}
return max;
}
}
122. 买卖股票的最佳时机 II(中等)
思路:只取上升序列
class Solution {
public int maxProfit(int[] prices) {
int sum = 0;
int last = prices[0];
for(int i=1;i<prices.length;i++){
if(prices[i]>last)sum+=(prices[i]-last);
last = prices[i];
}
return sum;
}
}
123. 买卖股票的最佳时机 III(困难)
class Solution {
public int maxProfit(int[] prices) {
int buy1 = -prices[0];
int sell1 = 0;
int buy2 = -prices[0];
int sell2 = 0;
for(int i=1;i<prices.length;i++){
buy1 = Math.max(buy1,-prices[i]);
sell1 = Math.max(sell1,buy1+prices[i]);
buy2 = Math.max(buy2,sell1-prices[i]);
sell2 = Math.max(sell2,buy2+prices[i]);
}
return sell2;
}
}