目录
- 题目
- 1- 思路
- 2- 实现
- ⭐121. 买卖股票的最佳时机——题解思路
- 2- ACM实现
题目
- 原题连接:121. 买卖股票的最佳时机
1- 思路
模式识别
- 模式1:只能某一天买入 ——> 买卖一次 ——> dp 一次的最大利润
动规五部曲
- 1.定义dp数组,确定含义
- dp[i][0] :第 i 天持有股票的最大收益
- dp[i][1] :第 i 天没有股票的最大收益
- 2.递推公式
- 第 i 天持有股票
dp[i][0]
:- 第
i-1
天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
- 第
i
天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]
- 第
dp[i][0] = Math.max(dp[i - 1][0],-prices[i])
- 第 i 天没有股票
dp[i][1]
:- 第
i-1
天就没有股票 即dp[i-1][1]
- 第
i-1
天有,第i
天卖了dp[i-1][0]+prices[i]
- 第
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i])
- 第 i 天持有股票
- 3.初始化
- 第一天持有
dp[0][0] = -prices[i]
、第一天没有dp[0][1] = 0
- 第一天持有
- 4.遍历顺序
- 推导顺序为 从左到右 ,因此
i=1
到i<len
- 推导顺序为 从左到右 ,因此
2- 实现
⭐121. 买卖股票的最佳时机——题解思路
class Solution {public int maxProfit(int[] prices) {//1.定义 dp 数组// dp[i][0] 持有// dp[i][1] 没有int len = prices.length;int[][] dp = new int[len][2];//2.递推公式// dp[i][0] = Math.max(dp[i-1][0],-prices[i]);// dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);// 3. 初始化dp[0][0] = -prices[0];dp[0][1] = 0;//3.遍历顺序for(int i = 1 ; i < len;i++){dp[i][0] = Math.max(dp[i-1][0],-prices[i]);dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);}return dp[len-1][1];}
}
2- ACM实现
public class bestTime {public static int maxProfit(int[] prices){// 1. 定义dp数组// dp[i][0] 持有// dp[i][1] 没有int len = prices.length;int[][] dp = new int[len][2];// 2.递推公式// dp[i][0] = Math.max(dp[i-1][0],-prices[i]);// dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);// 3. 初始化dp[0][0] = -prices[0];dp[0][1] = 0;//4.遍历for(int i = 1 ; i < len;i++){dp[i][0] = Math.max(dp[i-1][0],-prices[i]);dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);}return dp[len-1][1];}public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("输入股价数组长度");int n = sc.nextInt();int[] prices = new int[n];System.out.println("输入数组值");for(int i = 0 ; i < n;i++){prices[i] = sc.nextInt();}System.out.println("最大利润为"+maxProfit(prices));}
}