[leetcode] Best Time to Buy and Sell Stock III

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most two transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

给定一个数组,第i个元素代表股票在第i天的价格,限定最多交易两次,求最大收益。

由于两次交易不能重叠,可以把数组切分成两部分,分别计算第一次交易能够获取的最大利益,和第二次交易能够获取的最大利益,然后把它们相加。

计算第二次的时候,可以从后往前计算,并保存最高卖出价,可以简化计算。

代码如下:

 1 class Solution {

 2 public:

 3     int maxProfit(vector<int> &prices) {

 4         // Start typing your C/C++ solution below

 5         // DO NOT write int main() function

 6         int profit = 0, n = prices.size();

 7         if (n == 0) {

 8             return 0;

 9         }

10         int l[n], r[n];

11         l[0] = 0;

12         r[n-1] = 0;

13         int minp = prices[0];

14         for (int i = 1; i < n; i++) {

15             l[i] = max(prices[i] - minp , l[i - 1]);        

16             minp = min(prices[i] , minp);

17         }

18         int maxp = prices[n - 1];

19         for (int i = n - 2; i >= 0; i--) {

20             r[i] = max(maxp - prices[i] , r[i + 1]);

21             maxp = max(prices[i] , maxp);

22         }

23         for (int i = 0; i < n; i++) {

24             profit = max(l[i] + r[i] , profit);

25         }

26         return profit;      

27     }

28 };

在这道题中,发现g++中在栈里面开辟数组居然可以不用限定编译时必须确定数组的值,也就是说下面的代码是合法的。

 1 #include <iostream>

 2 using namespace std;

 3 int main(int argc, char *argv[])

 4 {

 5     int n;

 6     cin >> n;

 7     int a[n];

 8     for( int i = 0 ; i < n ; i++ )

 9     {

10         a[i] = i;

11         cout<<a[i];

12     }

13 }

原来C99标准对数组进行了加强:

C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的。可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的。可以变化的只是数组的大小。可以使用*来定义不确定长的可变长数组。

 

 

     

你可能感兴趣的:(LeetCode)