本文共 1030 字,大约阅读时间需要 3 分钟。
思路:限制交易两次。首先,求出单次交易最大利润,然后,只有2种可能,与此次交易无关,那么不在左侧就在右侧,再求一次,或者是与此次交易有关,那么在此次交易的日期限制内找出一段利润最低(负值)。比较左侧,右侧,中间的负值的绝对值的大小。
这段代码写的比较丑,凑合的看吧。sum3是中间的负值。
public class Solution { public int maxProfit(int[] prices) { if (prices.length <= 1) { return 0; } int[] change = new int[prices.length - 1]; for (int i = 0; i < change.length; i++) { change[i] = prices[i + 1] - prices[i]; } int sum0 = 0; int s0 = 0; int b=0; int e=0; int begin0 = 0; int end0 = 0; for (int i = 0; i < change.length; i++) { s0 += change[i]; if (s0 < 0) { s0 = 0; b=i+1; e=i+1; } if (change[i] > 0) { e=i; } if (s0 > sum0) { sum0 = s0; begin0=b; end0=e; } } int sum1 = 0; int s1 = 0; for (int i = 0; isum1) { sum1 = s1; } } int sum2 = 0; int s2 = 0; for (int i = end0+1; i sum2) { sum2 = s2; } } int sum3 = 0; int s3 = 0; for (int i = begin0+1; i 0) { s3 = 0; } if (s3 < sum3) { sum3 = s3; } } return sum0+Math.max(0-sum3, Math.max(sum1, sum2)); }}
转载地址:http://fushb.baihongyu.com/