前言:这道题目实可以用 Kadane's Algorithm解决
对于kadane's algorithm 我们可以这么想,假设输入是
[7,1,5,3,6,4]
那么我们可以通过这个数组得到在每一天前买 后一天卖的数组(称收益数组)
[-6,4,-2,3,-2]
实际上这样就转换成了什么问题?没错!maximum subarray!我们只要求收益数组的maximum subarray!
subarray相当于是持有股票的时间段,比如最大的maximum subarray是 [4,-2,3],说明我们要在这段时期持有股票
代码
class Solution {
public int maxProfit(int[] prices) {
//corner case
if(prices==null||prices.length==0||prices.length==1)return 0;
int [] nums = new int[prices.length-1];
for(int i=1;i<prices.length;i++){
nums[i-1]=prices[i]-prices[i-1];
}
int result= maxSubArray(nums);
return result<0 ? 0:result;
}
public int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n];//dp[i] means the maximum subarray ending with A[i];
dp[0] = nums[0];
int max = dp[0];
for(int i = 1; i < n; i++){
dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);
max = Math.max(max, dp[i]);
}
return max;
}
}
实际上我们可以将代码简化,可以上leetcode相应solution去寻找。
不过个人感觉这样写的代码更容易让人理解