【数据结构与算法】最大子序列
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;
}
最大子序列问题,给定一个数组,求出最大的连续元素之和。
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;
}
相关文章推荐
- 求最大连续子序列之和的线性算法 c# 数据结构
- 【数据结构与算法】最大子序列和问题的求解
- 【数据结构与算法】小于等于k的最大连续子序列和
- 数据结构与算法——给定整数A1,A2,....An,....(可能有负数),求该数据序列的最大子序列的和
- 算法竞赛入门经典:第六章 数据结构基础 6.9 根据二叉树的后序和中序确定前序序列
- Pku acm 2239 Selecting Courses 数据结构题目解题报告(十二)---- 匈牙利算法求二分图的最大匹配
- 数据结构与算法——求最大子矩阵问题
- 数据结构与算法-求子数组的最大和
- 数据结构——最大值最小化 (划分子序列)
- 数据结构之一(引论及最大子序列和问题)
- 【数据结构与算法】寻找最大的K个数
- 数据结构——算法之(006)(求子数组的最大和)
- Python 数据结构与算法——从二分图到寻找最大排列(Maximum Permutation)
- 数据结构——图常用算法实现(DFS,BFS,最小生成树,最短路径,拓扑序列)
- Pku acm 3041 Asteroids 数据结构题目解题报告(十六)---- 匈牙利算法求二分图的最大匹配
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- 数据结构——算法之(020)( 和为n连续正数序列)
- Pku acm 2771 Guardian of Decency 数据结构题目解题报告(十五)---- 匈牙利算法求二分图的最大匹配
- 数据结构第5章例题 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。
- 【数据结构与算法经典问题解析】直方图中最大矩形