<leetcode122>买卖股票的最佳时机

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

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

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

示例 1:

输入: [7,1,5,3,6,4]
输出: 7

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

这道题用深搜可以解决
先说思路:
设初始数组为 price[], 长度为n

  1. 从第一个数开始,找第2个,第三个,第四个等等等数,如果设找到的数为next, 则如果price[next] > price[1], 就获*profit1 = price[next] > price[1] *
  2. 再从 pricep[next] 开始,再进行计算,找到next+1到 他下面比他大的值的差值profit2 ,得到新的最大利润max = profit1 + profit2,
  3. 第一跟第二步走完之后,从第一个数出发的就走完了,接着走第二个数开始的情况,也就是深度搜索。
    整个过程还是比较简单的,直接上代码

public class GuPiao122 {
    static int max = Integer.MIN_VALUE;

    public static void main(String[] args){

        int[] prices = {1,2,3,4,5};
        int sum = 0;
        calculate(prices, 0, sum);
        System.out.print(max);

    }


    public static void  calculate(int[] prices, int s, int sum){
        //边界处理好,如果到末尾了,因为没有下一个数给他判断得到profit,所以就return 结束掉
        if(s == prices.length-1){
            return;
        }
        //双层循环
        for(int i = s; i < prices.length; i++){
            for(int j = s+1; j < prices.length; j++){
              //如果后一个数比前一个数大,才进行搜索下
                if(prices[j] > prices[i]){
                    int profit = prices[j] - prices[i];
                    int newSum = profit +  sum;
                    if(newSum > max){
                        max = newSum;
                    }
                    for(int h = j+1; h<prices.length; h++){
                        calculate(prices, h, newSum);
                    }
                }
                //如果后一个数没前一个数大,就再找下一个 ( 这里是通过 j+1操作的)  



            }
        }
    }
}

原文地址:https://www.cnblogs.com/disandafeier/p/9875303.html