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

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

Example 1:

Input: [7, 1, 5, 3, 6, 4]
Output: 5 max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)

Example 2:

Input: [7, 6, 4, 3, 1]
Output: 0 In this case, no transaction is done, i.e. max profit = 0.

题目标签:Array, Dynamic Programming

  题目给了我们一个array, 每一个数字代表了当时股票价格。让我们找出最大的收益。

  来更新一下,之前写的解题思路有点错误,所以这里重新写。

  试想一下,什么时候才有收益? Example 2 里就不存在最大收益,那么最基本是的 有一个小的值在前面,一个大的值在后面才有收益。

  那么什么时候才是 最大收益? 当一个最大收益出现时候,从index 0 开始 到 后面那个 卖出的价格 这个区间里,买入的价格肯定是这个区间里的min,卖出的是 从买入价格开始 到 卖出价格 这段区间里的max。

  那么是不是意味着 我们只要找到array里的min 和在min 之后范围里的max 就对了呢? 这是之前想错的地方。

  举个例子:7 14 1 5 3 6 4  这里最小的是1 在1后面最大的是6, 1 和 6的 profit 是5, 但是这里最大的收益是 14 - 7 = 7。

  所以我们要在遍历的过程中,一直维护更新一个min, 这个min最终的确是最小的那个,但是我们需要的min不一定是整个array中最小的。在遍历中,对于每一次的 收益 (目前的price - 目前的min),都要检查它是不是可能成为最大的收益。 这样做的目的是因为:我们不知道我们需要的min 是在什么时候出现,所以我们要检查所有 price - min 的可能性。因为上面的黑体字,最大收益肯定出现在 一段区间内, 买入的价格是区间里的min。

Java Solution:

Runtime beats 88.15%

完成日期:04/06/2017

关键词:Array, Dynamic Programming

关键点:时时保存最小价钱,对于每一个价钱,利用当前价格 - 最小价格, 保存最大收益值

 class Solution
{
public int maxProfit(int[] prices)
{
int maxProfit = 0;
int min = Integer.MAX_VALUE; for(int price: prices)
{
// keep updating the min all the time
min = Math.min(min, price);
// check each possible maxProfit and keep the larest one
maxProfit = Math.max(maxProfit, price - min);
} return maxProfit;
}
}

参考资料:

http://www.cnblogs.com/springfor/p/3877059.html

LeetCode 题目列表 - LeetCode Questions List

LeetCode 121. Best Time to Buy and Sell Stock (买卖股票的最好时机)的更多相关文章

  1. [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 ...

  2. 121. Best Time to Buy and Sell Stock买卖股票12

    一 [抄题]: If you were only permitted to complete at most one transaction (ie, buy one and sell one sha ...

  3. 121. Best Time to Buy and Sell Stock 买卖股票的最佳时机

    网址:https://leetcode.com/problems/Best-Time-to-Buy-and-Sell-Stock/ 第一想法是滑动窗口法,稍微尝试后发现不可行,至少我不会... 而后想 ...

  4. 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 ...

  5. 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 题目的要求是只买卖一次,买的价格越低,卖的价格越高,肯定收益就越大 遍历整个数组,维护一个当前位置之前最低的买入价格,然后每次 ...

  6. [LeetCode] 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 ...

  7. [LintCode] 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. [06] Session实现机制以及和Cookie的区别

    1.为什么有Session和Cookie 根据早期的HTTP协议,每次request-reponse时,都要重新建立TCP连接.TCP连接每次都重新建立,所以服务器无法知道上次请求和本次请求是否来自于 ...

  2. Python学习笔记008_类_对象_继承_组合_类相关的BIF

    # 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...

  3. python装饰器练习题

    练习题1. 请使用python, 对下面的函数进行处理, def hello(name): print "hello, %s" % name 在函数被调用时打印耗时详情 <f ...

  4. Linux中组 与 用户的管理

    在linux中建立组的指令是 groupadd 组名 相应的,删除组的指令: groupdel 组名 查看自己用户的组: groups 一个用户可以在多个组里面,用这个命令可以将用户添加到组: add ...

  5. Unity 3D Time 类

    Time   class in UnityEngine Description The interface to get time information from Unity. Static Var ...

  6. day14<常见对象+>

    常见对象(正则表达式的概述和简单使用) 常见对象(字符类演示) 常见对象(预定义字符类演示) 常见对象(数量词) 常见对象(正则表达式的分割功能) 常见对象(把给定字符串中的数字排序) 常见对象(正则 ...

  7. 《Node.js在CLI下的工程化体系实践》成都OSC源创汇分享总结

    背景: 随着开发团队规模不断发展壮大,在人员增加的同时也带来了协作成本的增加,业务项目越来越多,类型也各不相同.常见的类型有组件类.活动类.基于React+redux的业务项目.RN项目.Node.j ...

  8. Python uwsgi 无法安装以及编译报错的处理方式

    之前安装uwsgi的时候编译一步有出错,因为比较早,部分错误代码已经找不到了,网上找了部分错误信息, 现把解决方式共享出来. 环境:CentOS release 6.4   Python 2.7.3 ...

  9. Linux入门之常用命令(12)用户管理

    [用户管理] linux如何查看所有的用户和组信息的方法: 1.cat /etc/passwd: 2.cat /etc/group 1. useradd useradd 命令可以创建一个新的用户帐号, ...

  10. FPGA与PCI-E

    从并行到串行: PCI Express(又称PCIe)是一种高性能.高带宽串行通讯互连标准,取代了基于总线的通信架构,如:PCI.PCI Extended (PCI-X) 以及加速图形端口(AGP). ...