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;
    }
};

 

 
    

 

 

 

转载于:https://www.cnblogs.com/syjbupt/p/7441045.html

你可能感兴趣的:(数据结构与算法)