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

         

  • 相关阅读:
    android有进度条的下载图片并且显示图片
    在Java中,直接将类的对象使用system.out.println输出
    改写toString
    Android中Uri的使用
    重写toString()
    权限管理
    实训
    第一次上传文件成功
    sql server 2005 JDBC连接遇到的问题
    JSP 权限控制
  • 原文地址:https://www.cnblogs.com/jostree/p/3705122.html
Copyright © 2011-2022 走看看