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;
        }
    };
    
  • 相关阅读:
    JS日期格式转换
    VMware虚拟化集群的配置(一)
    网络初级篇之STP(概念原理)
    运维学习篇之jenkins的安装(CentOS7)
    网络初级篇之配置telnet登录网络设备(实验)
    Linux操作篇之OpenKM的安装(汉化)
    网络初级篇之网络设备的FTP(原理与实验)
    网络初级篇之直连路由与静态路由(原理与实验)
    网络初级篇之DHCP原理与配置(原理与实验)
    网络初级篇之OSPF(二)实验
  • 原文地址:https://www.cnblogs.com/ysherlock/p/8427230.html
Copyright © 2011-2022 走看看