zoukankan      html  css  js  c++  java
  • LeetCode

    这道题我一开始想到用递归方法,可以把规模大的问题变成规模小的问题,但是觉得递归的时间复杂度很高,因为它会把相同的问题进行重复计算,然后我想是不是有什么down-up的方法,先把所有的子问题的结果保存起来,但是发现问题的最优解并不能由子问题的最优解推导出来。最后就想到买股票的时候,我们在一个局部极小的时候买进,然后在一个局部极大的时候卖出,这样就可以通过多次买进卖出交易获得最大收益。接下来的问题就是,确定什么时候是极小值,什么时候是极大值。

    下面是AC代码:

     1     /**
     2      * Design an algorithm to find the maximum profit. You may complete as many transactions as you like 
     3      * (ie, buy one and sell one share of the stock multiple times).
     4      *  However, you may not engage in multiple transactions at the same time 
     5      *  (ie, you must sell the stock before you buy again).
     6      * @param prices
     7      * @return
     8      */
     9     public int maxProfit2(int[] prices){
    10         if(prices==null || prices.length <= 1)
    11             return 0;
    12         int profit = 0;
    13         int len = prices.length;
    14         //the local minimum is marked as -1;the local maximum is marked as 1; otherwise is 0
    15         int[] mark = new int[len];
    16         int[] left = new int[len];//mark whether the left is <= or >=
    17         int[] right = new int[len];//mark whether the right is <= or >=
    18         // the first number is initialized as 0
    19         left[0] = 0;
    20         //get the left array, by one traversal
    21         int i=1;
    22         while(i<len){
    23             if(prices[i-1]<prices[i])
    24                 left[i] = -1;
    25             else if(prices[i-1]>prices[i])
    26                 left[i] = 1;
    27             else
    28                 left[i] = left[i-1];
    29             i++;
    30         }
    31         //initialize the last element 
    32         right[len-1] = 0;
    33         i = len-2;
    34         while(i>=0){
    35             if(prices[i+1]<prices[i])
    36                 right[i] = -1;
    37             else if(prices[i+1]>prices[i])
    38                 right[i] = 1;
    39             else
    40                 right[i] = right[i+1];
    41             i--;
    42         }
    43         //get the mark
    44         i = 0;
    45         while(i<len){
    46             if(left[i] == right[i]){
    47                 mark[i] = left[i]*(-1);
    48             }else {
    49                 if(left[i] == 0){
    50                     mark[i] = right[i]*(-1);
    51                 }
    52                 else if(right[i] == 0)
    53                         mark[i] = left[i]*(-1);
    54                 else
    55                     mark[i] = 0;
    56             }
    57             i++;
    58         }
    59         int buy=0 ,sell = 0;
    60         boolean f1 = false, f2 = false;
    61         for(i=0;i<len;i++){
    62             if(f1==false && mark[i] == -1)//at the minimum time buy.
    63             {
    64                 buy = prices[i];
    65                 f1 = true;
    66             }
    67             if(f2 == false && f1 == true && mark[i] == 1)//at the maximum time sell, by the condition that we have bought the stock;
    68             {
    69                 sell = prices[i];
    70                 f2 = true;
    71             }
    72             if(f1 && f2)
    73             {
    74                 profit += (sell - buy); 
    75                 f1 = false;
    76                 f2 = false;
    77             }
    78         }
    79         return profit;
    80      }
    有问题可以和我联系,bettyting2010#163 dot com
  • 相关阅读:
    bzoj2683简单题 cdq分治
    bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp
    bzoj1767[Ceoi2009]harbingers 斜率优化dp
    bzoj2753[SCOI2012]滑雪与时间胶囊 最小生成树
    bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp
    刷题总结——pole(uva 1638 dp)
    刷题总结——分配笔名(51nod1526 trie树)
    刷题总结——树有几多愁(51nod1673 虚树+状压dp+贪心)
    刷题总结——book of evil(codefoeces 337D)
    刷题总结——解方程(NOIP2014)
  • 原文地址:https://www.cnblogs.com/echoht/p/3702819.html
Copyright © 2011-2022 走看看