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
这个题我觉得最自然的第一想法就是你每尝试买一个stock, 然后iterate whole remaning list, 然后用一个Maxprofit变量记录max profit so far. 但是这么做的话,run time会很恐怖。
怎么样优化呢?用一个目前最小的购入价变量表示当今天为止,最低的适合购入的价格。
int minBuyingPriceSofar = prices[0] ;
然后不断iterate, 如果股票价格比minBuyingPrice 要高,证明是属于可以卖掉的机会。
if (prices[i] > minBuyingPriceSofar) {
maxProfit = Math.max(maxProfit, prices[i] - minBuyingPriceSofar) ;
else 购入价可以变得更低一点。
minBuyingPriceSofar = prices[i];
这个题的重点就是,buying price越低越好, 就算arr前面部分price比我这个element要大很多,不关我事,因为不能倒卖回去。我们只关注price 比buying price更高的地方。
key: minBuyingPriceSofar 和 maxProfit
一点点感悟:
如果我是面试官,我会比较期待我的intervier 先给出暴力解法,然后说明这个不可取。 然后花时间整理出来optimization 的逻辑,之后再开始写代码。