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. 03_Ext_Viewport_Window_Dialog

    Viewport Viewport 代表整个浏览器窗口,直接渲染到document.body节点,取代页面中的所有内容.一般作为应用程序主界面. 随着浏览器显示区域的大小自动改变,一个页面中只能有一个 ...

  2. Linux下Birt、JTreeChart中文乱码问题解决办法

    Linux下JTreeChart,Birt等报表工具显示中文乱码解决 1) 现象: 在Windows上生成的报表图片展示正常,但是在Linux上显示(怪异的小方块“口”): 2)问题定位: 这是lin ...

  3. Linux 安装 mysql 并配置

    1.下载 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载版本:我这里选择的5.6.33,通用版,linux下64位 也可 ...

  4. ①【javascript设计到的技术点】

    一.dom操作: document.getElementById() document.getElementsByTagName() 二.事件操作: dom2级事件 主流浏览器 addEventLis ...

  5. 使用 TUN 设备实现一个简单的 UDP 代理隧道

    若要实现在 Linux 下的代理程序,方法有很多,比如看着 RFC 1928 来实现一个 socks5 代理并自行设置程序经过 socks5 代理等方式,下文是使用 Linux 提供的 tun/tap ...

  6. android-蓝牙通信

    一:简介 由于项目曾经想用蓝牙通信,但由于蓝牙传输速度比较慢,最终还是没有使用蓝牙,不过还是在空闲之余研究了蓝牙通信,鉴于目前网上蓝牙这块教程并不多,尤其是从蓝牙扫描,蓝牙配对,蓝牙通信等完整的教程更 ...

  7. Prison Break

    Prison Break 时间限制: 1 Sec  内存限制: 128 MB提交: 105  解决: 16[提交][状态][讨论版] 题目描述 Scofild又要策划一次越狱行动,和上次一样,他已经掌 ...

  8. js自执行函数写法

    (1)写法1 (function(){ //函数内容 })() (2)写法2 (function(){ //函数内容 }())

  9. __无标题栏的窗口拖动___javafx

    遇到困难::添加mouseevent监听,我用的mouse_DragedDetected配合MouseEvent.Pressed,,闪的不行,后来借鉴swing的pressed,move,releas ...

  10. C# XML序列化

    /// <summary> /// XML序列化为指定对象 /// Author:taiyonghai /// Time:2016-08-22 /// </summary> / ...