zoukankan      html  css  js  c++  java
  • 【力扣】123. 买卖股票的最佳时机 III

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例 1:

    输入:prices = [3,3,5,0,0,3,1,4]
    输出:6
    解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。
      随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。
    示例 2:

    输入:prices = [1,2,3,4,5]
    输出:4
    解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。  
      注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。  
      因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
    示例 3:

    输入:prices = [7,6,4,3,1]
    输出:0
    解释:在这个情况下, 没有交易完成, 所以最大利润为 0。
    示例 4:

    输入:prices = [1]
    输出:0
     

    提示:

    1 <= prices.length <= 105
    0 <= prices[i] <= 105

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    public int maxProfit(int[] prices) {
    
            //动态规划:
                //时间复杂度O(n)
                //空间复杂度O(1)
    
            //当天一种有几种状态
                //1.不买 - 利润为0
                //2.进行了一次买操作 buy1
                    //初始值:buye1=-price[0]; --即买第一个
                    //buy1 = Math.max(buy1[i-1],-prices[i]) //后续比较前一个和当前的每一个哪个更大
                //3.进行了一次买操作和一次卖操作,即完成了一笔交易; sell1
                    //初始值:sell1=0
                    //sell1 = Math.max(buy1[i-1] + prices[i],sell1[i-1]); //如果之前卖出了,就取之前卖出的;之前买入了就用买入的加上当前的价格
                //4.在完成了一笔交易的前提下,进行了第二次买操作;buy2
                    //初始值:buye2=-price[0]; --即买第一个
                    //buy2 = Math.max(buy2[i-1],sell1[1]-prices[i]) //后续比较前一个和当前的每一个哪个更大
                //5.完成了全部两笔交易。 sell2
                    //初始值:sell2=0
                    //sell2= Math.max(sell2[i-1],buy2[i-1] + prices[i]);
    
            int buy1 = -prices[0] , buy2 = -prices[0];
            int sell1 = 0 , sell2 = 0;
    
            int tempBuy1 = buy1;
            int tempSell1 = sell1;
            int tempBuy2 = buy2;
            for(int i = 1; i < prices.length ; i++){
                tempBuy1 = buy1;
                tempSell1 = sell1;
                tempBuy2 = buy2;
                buy1 = Math.max(tempBuy1,-prices[i]);
                sell1 = Math.max(tempBuy1 + prices[i],tempSell1);
                buy2 = Math.max(tempBuy2,sell1-prices[i]);
                sell2= Math.max(sell2,tempBuy2 + prices[i]);
            }
            return sell2;
        }
    一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
  • 相关阅读:
    自适应PC端网页制作使用REM
    iis express添加虚拟目录
    VC++2010组件安装失败解决办法
    AXURE 8弄一个轮播图的步骤
    浏览器在DPI缩放时变化问题
    数据结构综合训练1
    数据结构上机5二叉树遍历
    数据结构-约瑟夫环
    数据结构上机4队列-杨辉三角2
    数据结构上机4队列-杨辉三角1
  • 原文地址:https://www.cnblogs.com/fengtingxin/p/14275104.html
Copyright © 2011-2022 走看看