1. 程式人生 > >演算法設計與分析作業10

演算法設計與分析作業10

                121. Best Time to Buy and Sell Stock

Description:

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

If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.

Note that you cannot sell a stock before you buy one.

Example 1:

Input: [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
             Not 7-1 = 6, as selling price needs to be larger than buying price.

Example 2:

Input: [7,6,4,3,1]
Output:
0 Explanation: In this case, no transaction is done, i.e. max profit = 0.

想要求出最大利益,有兩種解題思路。

思路一:

用兩重迴圈遍歷所有可能的交易,求出最大利益,時間複雜度為O(n^2)。

程式碼如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() == 0) return 0;
        int maxProfit = 0;
        for(int i = 0; i < prices.size(); i++) {
            for (int j = i+1; j < prices.size(); j++) {
                if (prices[j]-prices[i] > maxProfit)
                    maxProfit = prices[j]-prices[i];
            }
        }
        return maxProfit;
    }  
};

思路二:

維護一個當前最大利益maxProfit以及最小值minPrice,只需遍歷一次即可求出最大利益,時間複雜度為O(n)。

程式碼如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() == 0) return 0;
        int maxProfit = 0;
        int minPrice = prices[0];
        for (int i = 1; i < prices.size(); i++) {
            maxProfit = max(maxProfit, prices[i]-minPrice);
            minPrice = min(minPrice, prices[i]);
        }
        return maxProfit;
    }  
};