zoukankan      html  css  js  c++  java
  • Leetcode 121. Best Time to Buy and Sell Stock 最佳股票售卖时(动态规划,数组,模拟)

    题目描述

    已知一个数组,第i个元素表示第i天股票的价格,你只能进行一次交易(买卖各一次),设计算法找出最大收益

    测试样例

    Input: [7, 1, 5, 3, 6, 4]
    Output: 5
    最大收益 = 6-1 = 5 (不是7-1 = 6,因为先买后卖,7买,1买亏了6)
    
    
    Input: [7, 6, 4, 3, 1]
    Output: 0
    最大收益为0
    

    详细分析

    初看非常简单,遍历数组,每次选择一个元素,找到这个元素后面的数组的最大值,计算差值,和当前最大收益比较即可,就像这样:
    [7,1,5,3,6,4] 当前7,后面最大6,收益-1
    [7,1,5,3,6,4] 当前1,后面最大6,收益5
    [7,1,5,3,6,4] 当前5,后面最大6,收益1
    如此继续找到即可。
    不过这种方法会超时,稍微改变一下,现在不止保持最大收益,还保存最低价格,如果当天价格更低,就刷新最小价格(买),同时如果当天价格减去最小价格的收益最大,就刷新最大价格(卖),过程如下:

    [7,1,5,3,6,4] minPrice=INT_MAX,maxProfit=0 => minPrice=7,maxProfit=0

    [7,1,5,3,6,4] minPrice=7,maxProfit=0 => minPrice=1,maxProfit=0

    [7,1,5,3,6,4] minPrice=1,maxProfit=0 => minPrice=1,maxProfit=4

    [7,1,5,3,6,4] minPrice=1,maxProfit=4 => minPrice=1,maxProfit=4

    [7,1,5,3,6,4] minPrice=1,maxProfit=4 => minPrice=1,maxProfit=5

    [7,1,5,3,6,4] minPrice=1,maxProfit=5 => minPrice=1,maxProfit=5

    算法实现

    • 方法1:Time Limit Exceeded
    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            int profit = 0;
            for(auto start=prices.begin();start!=prices.end();start++){
                int buy = *start;
                int sell = *std::max_element(start,prices.end());
                if((sell - buy)>profit){
                    profit = sell-buy;
                }
            }
            return profit;
        }
    };
    
    • 方法2: Accepted
    class Solution{
    public:
        int maxProfit(vector<int> &prices){
            int profit = 0;
            int minBuy = std::numeric_limits<int>::max();
            for(int i=0;i<prices.size();i++){
                //buy it if current price is less than minimum prices yet
                if(prices[i]<minBuy){
                    minBuy = prices[i];
                }
                //sell it if current profit got optimally
                if((prices[i]-minBuy)>profit){
                    profit = prices[i]-minBuy;
                }
            }
            return profit;
        }
    };
    
  • 相关阅读:
    CSS优先级及继承
    group by 与 order by
    软件开发升级指南(转)
    安装DELL服务器,安装Windows 2003 sp2 问题
    SQL SERVER 2005数据库总结
    C#操作INI文件(调用WindowsAPI函数:WritePrivateProfileString,GetPrivateProfileString)
    对RBS理解与使用
    WSS和MOSS的区别
    关于.net winform ComboBox数据绑定显示问题
    OpenNETCF.Desktop.Communication.DLL程序集的使用
  • 原文地址:https://www.cnblogs.com/ysherlock/p/8427230.html
Copyright © 2011-2022 走看看