Best Time to Buy and Sell Stock

原创 2015年07月09日 22:51:59

leetcode中的股票问题(1)

最近股市比较吸引眼球,而正好刷到了leetcode中股票问题,啥都不说了,我们来一起探讨探讨。
https://leetcode.com/problems/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.
翻译:有一个int类型数组,第i个元素表示股票在这一天的价格,如果最多只允许你进行一手交易(在某天买入股票然后在之后的某一天卖掉股票),设计一种算法找出最大的收益。

问题分析

先来张图直观的理解一下:
股价趋势图
凭直觉,不难发现我们要找的其实是:
这里写图片描述
这一手交易可以赚9-2 =7元钱,直观的感受当然是拿最高的票价减去最低的票价。但是可以看出,12号的票价是最低的,为1元,但是却没有用,因为虽然可以以1元的价格买入,但其后并没有很高的价格可以卖出了,很可惜~
也就是说,高价出现在低价后面才有意义,说白了无非是要找两个数值:买入的那一天(buy),和卖出的那一天(sell),返回值为maxpricesellprice(buy)price(x)表示股票在第x天的价格。
假设我们分析在第i天卖出所能获得的最大收益,则必然是price(i)min(i)>0?price(i)min(i):0这里我们约定min(i)表示第i天之前的最低价,当然如果第i天之前最小的股价都比第i天大,那在这一天卖出只能亏钱咯,而题目中说at most one transaction所以买卖不做咯。
然后的想法就简单啦,我们从做到右扫一遍,记录在每天卖出的最大收益,用一个标记来维护最大值就行啦~~~

代码

public int maxProfit(int[] prices) {
    //less then two days, no game
    if(prices.length < 2)
    {
        return 0;
    }

    //tag to maintian the min price
    int leastTag = prices[0];
    //tag to maintian the max profit
    int profit = 0;
    for(int i = 1; i < prices.length; i++)
    {
        if( prices[i] - leastTag > profit)
        {
            profit = prices[i] - leastTag;
        }
        //else means price[i] < profit + leastTag
        //but not necessarily price[i] < leastTag
        else if(prices[i] < leastTag) 
        {
            leastTag = prices[i];
        }
    }
    return profit;
}

今天就到这里咯,明天来玩股票的2、3、4题

版权声明:本文为博主原创文章,未经博主允许不得转载。

【LeetCode-面试算法经典-Java实现】【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】

【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Say you have a...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月14日 06:16
  • 6305

Best Time to Buy and Sell Stock III 两次买卖股票的最佳时机 (重重重)

题目: 只能买卖两次,er
  • skyoceanlover
  • skyoceanlover
  • 2014年08月21日 16:51
  • 778

动态规划的经典问题初探: Best Time to Buy and Sell Stock(DP)

1.DescriptionSay you have an array for which the ith element is the price of a given stock on day i....
  • w_bu_neng_ku
  • w_bu_neng_ku
  • 2017年10月26日 01:33
  • 49

Best Time to Buy and Sell Stock II 最佳时间买入卖出股票(多次买卖)@LeetCode

package Level3; /** * Best Time to Buy and Sell Stock II * * Say you have an array for which t...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月07日 12:34
  • 9758

Best Time to Buy and Sell Stock 最佳时间买入卖出股票(一次买入卖出) @LeetCode

package Level2; /** * Best Time to Buy and Sell Stock * * Say you have an array for which the ...
  • hellobinfeng
  • hellobinfeng
  • 2013年10月19日 00:29
  • 1974

Best Time to Buy and Sell Stock III 最佳时间买入卖出股票(最多两次买卖)@LeetCode

直到要用DP做,但是一开始思路是错的。后来参考了 http://blog.csdn.net/pickless/article/details/12034365 才意识到可以在整个区间的每一点切开,然后...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月08日 00:34
  • 20460

Best Time to Buy and Sell Stock III(最多出手两次的多大获利)

出现的bugs: (1)由两个if的来计算序列的值,讨论了>和 (2)引用初始化。在两个函数里的两个参数引用初始化了同一个vector,结果是第二个引用参数由于iterator的更改而全部失效,也...
  • ylzintsinghua
  • ylzintsinghua
  • 2014年12月13日 16:14
  • 298

【Leetcode】Stock Buy and Sell 系列问题 终极分析!

股票系列一共五个变种,这里先分析其中的三个。 第一个:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/?tab=Descri...
  • u010900754
  • u010900754
  • 2017年02月20日 04:27
  • 240

linux 常用sell 语句

文件读取 cat 文件名|while read line echo $line done 取算术运算结果 echo $[4+5] 输出为9 if语句 一般格式为 if[ va...
  • lixin_4055
  • lixin_4055
  • 2013年08月13日 12:45
  • 1001

基于OPL结合cutstock案例梳理Column Generation 算法

列生成算法的核心思想非常朴素,借鉴单纯形法迭代中的“进基”思想,实际的原始问题可能很多列向量,但是真正“入基”的列向量却只占很少的一部分,因此如果能人工干预挑选出那些“质量比较好”的列向量进行求解,将...
  • polarbear_gh
  • polarbear_gh
  • 2014年11月24日 16:49
  • 2906
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Best Time to Buy and Sell Stock
举报原因:
原因补充:

(最多只允许输入30个字)