#122 Best Time to Buy and Sell Stock II

Description

You are given an integer array prices where prices[i] is the price of a given stock on the ith day.

On each day, you may decide to buy and/or sell the stock. You can only hold at most one share of the stock at any time. However, you can buy it then immediately sell it on the same day.

Find and return the maximum profit you can achieve.

Examples

Example 1:

Input: prices = [7,1,5,3,6,4]
Output: 7
Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4.
Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3.
Total profit is 4 + 3 = 7.

Example 2:

Input: prices = [1,2,3,4,5]
Output: 4
Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
Total profit is 4.

Example 3:

Input: prices = [7,6,4,3,1]
Output: 0
Explanation: There is no way to make a positive profit, so we never buy the stock to achieve the maximum profit of 0.

Constraints:

1 <= prices.length <= 3 * 1 0 4 10^4 104
0 <= prices[i] <= 104

思路

有两种思路,第一种是比较好理解的

思路1

就是现在array中的每个元素都可能处于两种状态,一种是可以被卖出(canSoldState),一种是可以被买入(canBuyState),我们另上一个元素的两种状态值为preSoldState和preBuyState,那当前元素的两种状态分别有2更新可能

  • canSoldState:维持preSoldState;在preBuyState的基础上购入Price
  • canBuyState: 维持preBuyState;在preSoldState的基础上卖出Price
    最后返回的是最后一个元素的canBuyState状态值

思路2

思路2和Best Time to Buy and Sell Stock比较接近,就是记录当前段落内的min,然后找到第距离min最近的极大值点,极大值-min添加到收入上,极大值后的点作为min继续向下探索。

代码

思路1

class Solution {
    public int maxProfit(int[] prices) {
        int canSoldState = Integer.MIN_VALUE;
        int canBuyState = 0;
        
        for (int price: prices) {
            int preSoldState = canSoldState;
            int preBuyState = canBuyState;
            
            canSoldState = Math.max(preSoldState, preBuyState - price);
            canBuyState = Math.max(preBuyState, preSoldState + price);
        }
        
        return canBuyState;
    }
}

思路2

class Solution {
    public int maxProfit(int[] prices) {
        int count = 0;
        int currMax = 0;
        int currMin = prices[0];
        
        for (int price: prices) {
            if (price - currMin < currMax) {
                currMin = price;
                count += currMax;
                currMax = 0;
                continue;
            }        
            currMax = price - currMin;
        }
        
        count += currMax;
        return count;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值