public int maxProfit(int[] prices) {
int len=prices.length;
if(len==2)
return prices[1]>prices[0]?prices[1]-prices[0]:0;
int sum=0,tmp=0;
int fast=0,slow=0;
for(int i=0;i<len-1;i++){
if(prices[i+1]>=prices[i])
fast=i+1;
else{
if(fast>slow)
tmp=prices[fast]-prices[slow];
if(tmp>sum)
sum=tmp;
slow=i+1;
}
}
return sum;
}
I解题思路
这道题有点类似于最大子数组之和。从前后到遍历数组的时候,求出截止到这个数组可以获得的最大利润。
公式是spotrate=a[i]-a[i-1]+spotrate.后面的soptrate是a[i-1]的最大利润。如果spotrate<0,就让spotrate=0就好了。然后设置一个变量记录最大的spotrate。
遍历到下标2时,最大利润spotrate=5-3+1=3,也等于5-2;
遍历到下标3时,最大利润spotrate=1-5+3=-1,所以让spotrate=0,这个点卖的话最大利润只能是0;
遍历到下标4时,最大利润spotrate=5-1+0=4;大于刚才的最大利润3,所以最大利润是4。
这样在O(n)就可以求出最大利润。空间复杂度是O(1);
public int maxProfit(int[] prices) {
int len=prices.length;
int sum=0,spotrate=0;
for(int i=1;i<len;i++){
spotrate=Math.max(prices[i]-prices[i-1]+spotrate,0);
if(spotrate>sum)
sum=spotrate;
}
return sum;
}
II解题思路
刚开始的思路是,把这些股价分段计算出每一个上升段的最大差值,然后写的程序。
后来发现只需要后项直接减去前项就可以(后项比前项大),
sum = sum+a[i+1]-a[i](if a[i+1]>a[i])
思路一程序,可用来对相同问题,做一个代码段。
public class Solution {
public int maxProfit(int[] prices) {
int len=prices.length;
int sum=0;
int fast=0,slow=0;
for(int i=0;i<len-1;i++){
if(prices[i+1]>=prices[i])
fast=i+1;
else{
if(fast>slow)
sum+=prices[fast]-prices[slow];
slow=i+1;
}
}
if(fast==len-1)
sum+=prices[fast]-prices[slow];
return sum;
}
}
思路二代码:最简单,后项减前项 伪代码
class Solution:
# @param prices, a list of integer
# @return an integer
def maxProfit(self, prices):
ans = 0
for i in range(0,len(prices)-1):
if (prices[i+1]-prices[i]>0):
ans = ans + prices[i+1]-prices[i]
return ans