您的位置:首页 > 理论基础 > 数据结构算法

【数据结构与算法】最大子序列

2017-01-14 00:12 525 查看
今天在刷leetcode的时候,发现了一个求最大子序列的算法,Kadane算法。

最大子序列问题,给定一个数组,求出最大的连续元素之和。

Kadane算法是DP(动态编程)的一种。思路是求出以数组中所有元素为结尾的最大子序列,返回其中最大的。max_cur表示以当前元素为结尾的子序列最大和,max_array表示所有当中的最大和,代码相当简洁。

如果要求不能返回负数和:

public int max_subarray(int[] nums) {
int max_cur = 0, max_subarray = 0;
for (int i = 0; i < nums.length; i++) {
max_cur = Math.max(0, max_cur + nums[i]);
max_subarray = Math.max(max_cur, max_subarray);
}
return max_subarray;
}

如果可以返回负数和:
public int max_subarray(int [] nums){
int max_cur = nums[0], max_subarray = nums[0];
for(int i = 0; i < nums.length; i++){
max_cur = Math.max(nums[0], max_cur + nums[i]);
max_subarray = Math.max(max_cur, max_subarray);
}
return max_subarray;
}可以看到上述算法在On时间内解决问题。

这种思路可以延伸到其他以子序列为背景的问题中,比如leetcode的121题https://leetcode.com/problems/best-time-to-buy-and-sell-stock/

求子序列首尾元素差值的最大。

public int maxProfit(int[] prices) {
int max_cur = 0, max_profit = 0;
for(int i = 1; i < prices.length; i++){
max_cur = Math.max(max_cur + prices[i] - prices[i - 1], 0);
max_profit = Math.max(max_cur, max_profit);
}
return max_profit;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐