【LeetCode】买卖股票
作者:互联网
问题1:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
题目链接:剑指 Offer 63. 股票的最大利润
贪心:强调只买卖一次,因此只需要记录一个当前的最小值即可,每遍历一个数都算一遍答案。
代码:
class Solution {
public int maxProfit(int[] prices) {
if(prices.length<2) return 0;
int minNum=prices[0];
int ans=0;
for(int i=1;i<prices.length;i++){
minNum=Math.min(prices[i],minNum);
ans=Math.max(prices[i]-minNum,ans);
}
return ans;
}
}
问题进阶:给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
题目链接:122. 买卖股票的最佳时机 II
思路:遍历一遍,只要后面比前面高就卖。
代码:
class Solution {
public int maxProfit(int[] prices) {
int ans=0;
for(int i=1;i<prices.length;i++){
ans+=Math.max(0,prices[i]-prices[i-1]);
}
return ans;
}
}
题目链接:309. 最佳买卖股票时机含冷冻期
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
思路:
动态规划,用dp[i][j]表示第i天的收入情况。第二维表示买入、卖出和冷冻分别对应0,1,2.
那么对应的状态转移为:
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][2]-prices[i]); dp[i-1][2]-prices[i]表示从冷冻期买入
dp[i][1]=dp[i-1][0]+prices[i];
dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]);
代码1:
class Solution {
public int maxProfit(int[] prices) {
int n=prices.length;
if(n<2) return 0;
int dp[][]=new int[n+1][3];
dp[0][0]=-prices[0]; //刚开始为负收益,买入就减,卖出就加
for(int i=1;i<n;i++){
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][2]-prices[i]);
dp[i][1]=dp[i-1][0]+prices[i];
dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]);
}
return Math.max(dp[n-1][1],dp[n-1][2]);
}
}
代码2:
class Solution {
public int maxProfit(int[] prices) {
// 动态规划,加一维表示0买入还是1卖出
//dp[i][x]表示第i-1天买入还是卖出的最大收益
int n=prices.length;
if(n<2) return 0;
int dp[][]=new int[n+1][2];
dp[0][0]=-prices[0];
dp[0][1]=0;
dp[1][0]=-prices[0];
dp[1][1]=0;
for(int i=2;i<=n;i++){
dp[i][0]=Math.max(dp[i-1][0],dp[i-2][1]-prices[i-1]); //买入
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i-1]); //卖出
}
return dp[n][1];
}
}
标签:买卖,int,股票,ans,Math,max,prices,LeetCode,dp 来源: https://blog.csdn.net/dl962454/article/details/121036271