码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-16 10:34:17      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:return   大连   com   std   连续   back   最大连续子数组和   解法   sel   

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

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

 

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

常规解:

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.股票问题(简单)

标签:return   大连   com   std   连续   back   最大连续子数组和   解法   sel   

原文地址:https://www.cnblogs.com/BillowJ/p/12710918.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!