题目描述

已知一个数组,第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;
}
};

Leetcode 121. Best Time to Buy and Sell Stock 最佳股票售卖时(动态规划,数组,模拟)的更多相关文章

  1. 30. leetcode 121. Best Time to Buy and Sell Stock

    121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...

  2. leetcode 121. Best Time to Buy and Sell Stock 、122.Best Time to Buy and Sell Stock II 、309. Best Time to Buy and Sell Stock with Cooldown

    121. Best Time to Buy and Sell Stock 题目的要求是只买卖一次,买的价格越低,卖的价格越高,肯定收益就越大 遍历整个数组,维护一个当前位置之前最低的买入价格,然后每次 ...

  3. [LeetCode] 121. Best Time to Buy and Sell Stock 买卖股票的最佳时间

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  4. LeetCode 121. Best Time to Buy and Sell Stock (买卖股票的最好时机)

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  5. Java for LeetCode 121 Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  6. leetcode 121. Best Time to Buy and Sell Stock ----- java

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  7. Python [Leetcode 121]Best Time to Buy and Sell Stock

    题目描述: Say you have an array for which the ith element is the price of a given stock on day i. If you ...

  8. [leetcode]121. Best Time to Buy and Sell Stock 最佳炒股时机

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  9. LeetCode 121. Best Time to Buy and Sell Stock (stock problem)

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

随机推荐

  1. Rails上传文件

    1.view <%= form_tag({:method =>"post",:controller =>"welcome",:action=& ...

  2. 简单的触发黑名单阻断演示 control+c

    #include "stdafx.h"#include <signal.h>#include <windows.h> #include <iostre ...

  3. [原]实例-简单设计&精简代码&复用代码

    引言 本文以实际项目为例谈一谈我个人对于软件开发的理解,偏细节   软件项目B 基于.net平台,使用WPF框架,c#语言,MVVM模式开发的桌面软件 该软件支持可视化的设计器功能,允许所见即所得的方 ...

  4. cookie禁用后非重定向跳转时session的跟踪

  5. Python之路:面向对象及相关

    其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object):     pass   obj = Foo()   isinstan ...

  6. CDOJ1324-卿学姐与公主 【线段树点更新】

    http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory ...

  7. ArcGIS10拓扑规则-面规则(转)

    ArcGIS10拓扑规则-面规则 原创 2013年12月27日 10:20:44 标签: ArcGIS 1879 ARCGIS 10 里提供的拓扑规则共32种,下面一一介绍: 首先介绍的对于面图层的拓 ...

  8. Codeforces 1114D Flood Fill (区间DP or 最长公共子序列)

    题意:给你n个颜色块,颜色相同并且相邻的颜色块是互相连通的(连通块).你可以改变其中的某个颜色块的颜色,不过每次改变会把它所在的连通块的颜色也改变,问最少需要多少次操作,使得n个颜色块的颜色相同. 例 ...

  9. 孕妇的孕周和体重对胎儿游离DNA在母体cfDNA占比的影响

    有一篇文件,研究了孕妇的孕周和体重对 胎儿游离DNA在母体cfDNA中占比的影响 文章名称:Gestational age and maternal weight effects on fetal c ...

  10. Entity Framework Tutorial Basics(2):What is Entity Framework?

    What is Entity Framework? Writing and managing ADO.Net code for data access is a tedious and monoton ...