首页 > 代码库 > [leetcode] Best Time to Buy and Sell Stock III

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