首页 > 代码库 > LeetCode - Best Time to Buy and Sell
LeetCode - Best Time to Buy and Sell
这道题要求的一个min和一个max,只是这个min所在的位置要在max所在位置的左边。
有一种做法是采用蛮力算法,也就是通过从左往右遍历,把每一个元素都当做min,然后再在这个元素的右边找一个最大值,这样得到一个profit,最后求得所有情况中profit的最大值即刻。但是这种做法的时间复杂度是O(n^2);
另一种做法是通过时间换空间的方法,我先用两个数组:数组1和数组2,数组1[i]表示从prices的第0个数到第i个数的最小值,数组2[i]表示从prices的第[len-1]个数到第i个数的最大值。
这种做法的时间复杂度是O(n),但是空间复杂度也是O(n).
所以如果有人想出时间复杂度是O(n),且空间复杂度是O(1), 请告诉我下啊!!!
下面是另一种做法的AC代码:
1 /** 2 * Say you have an array for which the ith element is the price of a given stock on day i. 3 * If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), 4 * design an algorithm to find the maximum profit. 5 * @param prices 6 * @return 7 */ 8 public int maxProfit(int[] prices) { 9 if(prices==null || prices.length <= 1) 10 return 0; 11 int len = prices.length; 12 //ma keep the minimum number till now. 13 int[] ma = new int[len]; 14 //mia keep the maximum number from the end to now 15 int[] mia = new int[len]; 16 ma[0] = prices[0]; 17 for(int i=1;i<len;i++){ 18 if(prices[i]>ma[i-1]) 19 ma[i] = ma[i-1]; 20 else 21 ma[i] = prices[i]; 22 } 23 mia[len-1] = prices[len-1]; 24 for(int i = len-2;i>=0;i--){ 25 if(prices[i]>mia[i+1]) 26 mia[i] = prices[i]; 27 else 28 mia[i] = mia[i+1]; 29 } 30 int max=0; 31 for(int i=0;i<len;i++){ 32 max= mia[i]-ma[i]>max? mia[i]-ma[i]:max; 33 } 34 return max; 35 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。