LeetCode:121.股票问题(简单)

Posted billowj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:121.股票问题(简单)相关的知识,希望对你有一定的参考价值。

题目描述:一次股票交易包含买入和卖出,只进行一次交易,求最大收益。

只要记录前面的最小价格,将这个最小价格作为买入价格,然后将当前的价格作为售出价格,查看当前收益是不是最大收益。

 

主要解题思路是转换成求最大连续子数组,整理了三个解法,单调栈我是没有想到的。。

常规解:

1.

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

2.

假设我们在第i天买入,第j (j > i)天卖出股票,获得的利润是prices[j] - prices[i].
记j - i = k,那么由于数学关系式可知:

prices[j] - prices[i] = (prices[j] - prices[i+k-1]) + (prices[i+k-1] - prices[i+k-1]) + .... + (prices[i+1] - prices[i])

那么知道每一个prices[i+1] - prices[i]后本题求max(prices[j] - prices[i])可以转换为求最大连续子数组和的问题

如股票价格为[7,1,5,3,6,4],则可以转换为求数组[-6, 4, -2, 3, -2]的最大连续子数组之和。

作者:melo7
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/jiang-ti-mu-zhuan-huan-wei-zui-da-lian-xu-zi-shu-z/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
  public:
    int maxProfit(vector<int> &prices) {
        if (prices.size() <= 1)
        {
            return 0;
        }

        int size = prices.size() - 1;
        for (int i = 0; i < size; i++) {
            prices[i] = prices[i + 1] - prices[i];
        }
        int res = maxSubArray(prices, size);
        return (res > 0) ? res : 0;
    }

    int maxSubArray(vector<int> &nums, int right) {
        int res = nums[0];

        for (int i = 1; i < right; i++) {
            if (nums[i - 1] > 0) {
                nums[i] += nums[i - 1];
            }
            res = max(res, nums[i]);
        }

        return res;
    }
};

 

3.

维护一个单调栈。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ans = 0;
        vector<int> St;
        prices.emplace_back(-1); \ 哨兵??‍??
        for (int i = 0; i < prices.size(); ++ i){
            while (!St.empty() && St.back() > prices[i]){ \ 维护单调栈??
                ans = std::max(ans, St.back() - St.front()); \ 维护最大值
                St.pop_back();
            }
            St.emplace_back(prices[i]);
        }

        return ans;
    }
};

作者:wen-mu-yang
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/c-li-yong-shao-bing-wei-hu-yi-ge-dan-diao-zhan-tu-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

以上是关于LeetCode:121.股票问题(简单)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode——121. 买卖股票的最佳时机

LeetCode 121. 买卖股票的最佳时机

LeetCode 121. 买卖股票的最佳时机

leetcode121 买卖股票的最佳时机(Easy)

[JavaScript 刷题] DP - 买卖股票的最佳时机,leetcode 121

[JavaScript 刷题] DP - 买卖股票的最佳时机,leetcode 121