文章目录
力扣算法学习day32-3
121-买卖股票的最佳时机
题目
代码实现
class Solution {
// 硬用dp,实际上我想到的原理是贪心,取左边最小,取右边最大 速度3ms
// public int maxProfit(int[] prices) {
// // 题目分析:从示例1中可以看出这只股是从一天买入后从另一天卖出,买只能买一次,卖也只能卖一次。
// // 最直接能够想到的是使用dp数组记录每个坐标能够获得的最大利润即可,然后最大利润需要一个辅助指针
// // 指向该坐标之前的股价的最小值用于与当前坐标股价进行比较来得到当前坐标能够获得的最大值。
// // 1.创建dp数组,dp[i]表示坐标i位置及之前的股价按照题意能够获得的最大利润。
// int[] dp = new int[prices.length];
// // 2.确定迭代公式:dp[i] = Math.max(dp[i-1],prices[i]-min) ,min为该坐标之前的最小值
// // 3.初始化,dp[0]需要初始化为0,因为不能在同一天买入再卖出。其实可以也是0.
// dp[0] = 0;
// // 4.确定遍历顺序
// int min = prices[0];
// for(int i = 1;i < dp.length;i++){
// if(prices[i] > min){
// dp[i] = Math.max(dp[i-1],prices[i]-min);
// } else{
// min = prices[i];
// dp[i] = dp[i-1];
// }
// }
// return dp[dp.length - 1];
// }
// 将dp换成result指针存储最大利润,因为题目其实只需要最后的最大利润,贪心 速度1ms
// public int maxProfit(int[] prices) {
// int result = 0;
// int min = prices[0];
// for(int i = 1;i < prices.length;i++){
// if(prices[i] > min){
// result = Math.max(result,prices[i]-min);
// } else{
// min = prices[i];
// }
// }
// return result;
// }
// 代码随想录dp思路:速度 25ms
// dp[i][0]:第i天,持有股票时,现金最大为多少。这里持有是指第i天买入或者在这之前买入(即在这之前为持有状态)
// 所以:dp[i][0] = Math.max(-prices[i],dp[i-1][0])
// dp[i][1]:第i天,未持有股票时,现金最大为多少。这里未持有是指第i天卖出或在这之前卖出(即在这之前为未持有状态)
// 所以:dp[i][1] = Math.max(prices[i] + dp[i-1][0],dp[i-1][1])
// public int maxProfit(int[] prices) {
// // 1.创建dp数组
// int[][] dp = new int[prices.length][2];
// // 2.确定迭代公式,上面思路已经顺便写了。
// // 3.初始化,上面的公式可以看出来,所有的推导都依赖于dp[0][0]和dp[0][1],所以需要初始化这两个
// // dp[0][0]第一天持有只有当天买入的情况
// dp[0][0] = -prices[0];
// // dp[0][1]第一天无法未持有,即不能卖,也没有之前的存在,那么不买就是最大现金,故未持有金额为0.
// dp[0][1] = 0;
// // 4.确定遍历顺序
// for(int i = 1;i < prices.length;i++){
// dp[i][0] = Math.max(-prices[i],dp[i-1][0]);
// dp[i][1] = Math.max(prices[i] + dp[i-1][0],dp[i-1][1]);
// }
// return dp[prices.length-1][1];
// }
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) return 0;
int length = prices.length;
// dp[i][0]代表第i天持有股票的最大收益
// dp[i][1]代表第i天不持有股票的最大收益
int[][] dp = new int[length][2];
int result = 0;
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
dp[i][1] = Math.max(dp[i - 1][0] + prices[i], dp[i - 1][1]);
}
return dp[length - 1][1];
}
}