Day48题目
LeetCode121买股票的最佳时机1
核心思想:可以使用贪心,选择左边最小的和右边最大的,也可以动态规划,需要保存是否持有股票的状态,dp[i][0]表示第i天,不持有股票,dp[i][1]表示第i天持有
class Solution {public int maxProfit(int[] prices) {int[][] dp = new int[prices.length+1][2];dp[0][0] = 0;dp[0][1] = -prices[0];for(int i = 1 ; i < prices.length; i ++){// 第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];}
}
LeetCode122买股票的最佳时机2
核心思想:也可以用贪心,只要比后一天小,就今天买,明天卖. 动态规划dp数组和上面一道题一样,只不过dp持有股票的含义略微变化
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 ++){// 第i天没有股票,可以是前一天有,今天卖了,或者前一天也没有dp[i][0] = Math.max(dp[i-1][1]+prices[i], dp[i-1][0]);// 第i天有股票,可以是前一天没有,今天买了,或者前一天就有. 两道题唯一的区别,上面的只能买一次,所以可以是 昨天没有,今天买,昨天也可以是之前什么时候卖完了dp[i][1] = Math.max(dp[i-1][0]-prices[i], dp[i-1][1]);}return dp[prices.length-1][0];}
}