121. 买卖股票的最佳时机

假设你有一个数组,其中第 i 个元素是一支给定股票第 i 天的价格。

如果您只能完成最多一笔交易(即买入和卖出一股股票),则设计一个算法来找到最大的利润。

示例 1:

输入: [7, 1, 5, 3, 6, 4]
输出: 5

最大利润 = 6-1 = 5(不是 7-1 = 6, 因为卖出价格需要大于买入价格)

 

示例 2:

输入: [7, 6, 4, 3, 1]
输出: 0

在这种情况下, 没有交易完成, 即最大利润为 0。

解题思路一(最好):
1.始终保存最小的买入价格
2.始终保存最大的利润
比如数据2,7,1,3
首先找到最小买入是2,然后做差7-2=5,保存利润,然后到最小买入变成1,此时利润还是5,然后到3,注意,这里就是核心了。
如果1后面出现的数字足够大,大到和1做差的值大于5,那么最大利润值就改变,否则,最大利润还是5.
这里暗含的逻辑是,后面的数如果减1的差肯定比减2的差来的大。

class Solution {
public:
	int maxProfit(vector<int>& prices) {
		int result = 0;
		int buy = INT_MAX;
		for (int price : prices) {
			buy = min(buy, price);
			result = max(result, price - buy);
		}
		return result;
	}
};


解题思路二:

遍历找后 - 前差最大的。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<int> res;
        //其实就是找数组中的后序 - 前序的最大差值
        if(prices.size() == 0)
            return 0;
        for(int i = 0;i < prices.size()-1;i++)
        {
            //找从i开始的最大值
            int max = -1;
            for(int j = i+1;j < prices.size();j++)
            {
                if(prices[j] > max)
                {
                    max = prices[j];
                }
            }
            max = max - prices[i];
            res.push_back(max);
        }
        int r;
        int max = -1000;
        for(int i = 0;i < res.size();i++)
            if(max < res[i])
                max = res[i];
        if(max < 0)
            return 0;
        else 
            return max;
    }
};



阅读更多

没有更多推荐了,返回首页