Leetcode刷题总结:121. Best Time to Buy and Sell Stock

题目:

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 (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

Example 1:

Input: [7, 1, 5, 3, 6, 4]
Output: 5

max. difference = 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

In this case, no transaction is done, i.e. max profit = 0.

 题解:

1. 第一个思路肯定是计算每一个i作为买入点,找到这个点后面的最大值,差值就是该点的最佳获利值;时间复杂度是O(n2);

2. 第二个思路,用一个数组保存i和i-1的差值gain[i] = price[i]-price[i-1],如:

Input: [7, 1, 5, 3, 6, 4]
gain: [0, -6, 4, -2, 3, -2]
问题转化为计算gain数组的最大连续子数组
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if (prices.size() <= 1) {
            return 0;
        }
        vector<int> gain(prices.size());
        gain[0] = 0;
        for (int i = 1; i < prices.size(); ++i) {
            gain[i] = prices[i] - prices[i-1];
        }
        
        int maxSum = 0;
        int sum = 0;
        for (int i = 1; i < gain.size(); ++i) {
            sum += gain[i];
            if (sum < 0) {
                sum = 0;
            }
            maxSum  = max(maxSum, sum);
        }
        return maxSum;
    }
};

 


 

 

 
posted @ 2017-08-27 18:10  糯米团子syj  阅读(150)  评论(0编辑  收藏  举报