放置两个哨兵,分别记录购买的最小值和利润的最大值
使用单个for循环进行遍历,每次遍历的时候比较当前时间是不是最低价格,是最低就记录下来最低价格,比较当前时间卖出股票是否是最大利润,是最大利润就记录下来,最后返回l利润最大值。
class Solution {
public int maxProfit(int[] prices) {
int max=0;
int min=Integer.MAX_VALUE;
for (int i=0;i<prices.length;i++){
if(prices[i]<min){
min=prices[i];
}
if(prices[i]-min>max){
max=prices[i]-min;
}
}
return max;
}
}
使用动态规划
建立二维dp[prices.length][2]
数组用来表示购买花费的最小值和利润的最大值。
其中dp[i][0]
表示的是第i天不持有股票时自己利润的最大值,其中包括情况:没有买过股票,dp[i][0]
的值为零。已经卖出了股票,当前的值为买进股票的花费加上卖出股票的收入,所以递推公式为:dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i])
其中dp[i][1]
表示的是第i天持有股票时自己的资产,为负数,选择自己购买花费值最小,所以递推公式为:dp[i][1]=max(dp[i-1][1],-prices[i])
class Solution {
public int maxProfit(int[] prices) {
if (prices.length<2 ) return 0;
int [][]dp=new int [prices.length][2];
/**
* dp[i][0]:表示今天不持股(没有购买或者已经卖出,没有购买,dp的值是0,卖出之后,dp的值就是收益)
* dp[i][1]:表示今天持股(今天或者今天之前购买了股票,值为负数,表示购买股票的花费)
* */
//初始化第一天的情况,第一天不持有股票,也就是没有购买,利润为0,第一天持有股票,也就是第一天购买股票,价格就是第一天值
dp[0][0]=0;
dp[0][1]=-prices[0];
for(int i=1;i<prices.length;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];
}
}