zoukankan      html  css  js  c++  java
  • 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 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

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

     1 class Solution 
     2 {
     3     public int maxProfit(int[] prices) 
     4     {
     5         int maxProfit = 0;
     6         int min = Integer.MAX_VALUE;
     7         
     8         for(int price: prices)
     9         {
    10             // keep updating the min all the time
    11             min = Math.min(min, price);
    12             // check each possible maxProfit and keep the larest one
    13             maxProfit = Math.max(maxProfit, price - min);
    14         }
    15         
    16         return maxProfit;
    17     }
    18 }

    参考资料:

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

    LeetCode 题目列表 - LeetCode Questions List

  • 相关阅读:
    c++:函数模板
    1084 外观数列
    1083 是否存在相等的差
    1082 射击比赛
    1081 检查密码
    1080 MOOC期终成绩
    1079 延迟的回文数
    1078 字符串压缩与解压
    1077 互评成绩计算
    1076 Wifi密码
  • 原文地址:https://www.cnblogs.com/jimmycheng/p/7446514.html
Copyright © 2011-2022 走看看