标签:
题目
假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。
给出一个数组样例 [3,2,3,1,2], 返回 1
解题
通俗点说就是求 后面的数减去前面数所得结果的最大值,最后和0取最大值。
直接暴力,时间发杂度O(N2)
public class Solution { /** * @param prices: Given an integer array * @return: Maximum profit */ public int maxProfit(int[] prices) { // write your code here int Max = 0; if( prices == null || prices.length == 0) return 0; for(int i = 0;i< prices.length ;i++){ for(int j = i;j< prices.length ;j++) Max = Math.max(Max, prices[j] - prices[i]); } return Max; } }
上面的程序又j==i的一项,不要对最后结果和0比较取最大值了。
那么问题来了,有没有更好的方法了?
分成两部分,前半部分的最小值 后半部分最大值,两者相减就是答案,这个貌似不好解。
在变量数组的时候,其前面的最小值比较求,当前节点可以当作最大值,这个假定的最大值 和之前求的最小值的差,也就当前节点卖出所获的收益,是局部最大值。
局部最大值的最大值就是整体最大值。
public class Solution { /** * @param prices: Given an integer array * @return: Maximum profit */ public int maxProfit(int[] prices) { // write your code here int result = 0; if( prices == null || prices.length == 0) return 0; int min = prices[0]; for(int i = 1;i< prices.length ;i++){ result = Math.max(result,prices[i] - min); min = Math.min(min,prices[i]); } return result; } }
总耗时: 1303 ms
class Solution: """ @param prices: Given an integer array @return: Maximum profit """ def maxProfit(self, prices): # write your code here if prices == None or len(prices) ==0: return 0 Min = prices[0] res = 0 for p in prices: res = max(res,p-Min) Min = min(Min,p) return res
总耗时: 218 ms
标签:
原文地址:http://www.cnblogs.com/theskulls/p/4982506.html