最大子序列的3种不同时间复杂度的算法
2015-01-26 16:30
513 查看
第一种是最挫的O(N^2)的算法,就是直接暴力二重循环解之。
第二种的时间复杂度是O(NlogN),用到递归的方法,分治的思想,如果没有后面的的O(N)的算法,这个算法便体现了递归的威力。
第三种是最聪明也是最简单的方法了,时间复杂度为O(N),代码简单易懂,用thisSum来记录每一次累加的结果,如果大于maxSum,就让maxSum = thisSum,如果thisSum小于0,便让thisSum重新清零,如此从头遍历到尾即可。
public class MaxSubSum1 { public static int maxSubSum2(int[] a){ int maxSum = 0; for(int i = 0;i < a.length;i ++){ int thisSum = 0; for(int j = i;j < a.length;j ++){ thisSum += a[j]; if(thisSum > maxSum) maxSum = thisSum; } } return maxSum; } public static void main(String[] args){ int[] a = {-2,11,-4,13,-5,-2}; int maxSum = maxSubSum1(a); System.out.println(maxSum); } }
第二种的时间复杂度是O(NlogN),用到递归的方法,分治的思想,如果没有后面的的O(N)的算法,这个算法便体现了递归的威力。
public class MaxSubSum2 { public static int maxSumRec(int[] a,int left,int right){ /*当这个数组只有一个元素的时候*/ if(left == right) if(a[left] > 0) return a[left]; else return 0; /*递归*/ int center = (left + right) >> 1; int maxLeftSum = maxSumRec(a,left,center); int maxRightSum = maxSumRec(a, center+1, right); /*求左段的最大子序列*/ int maxLeftBorderSum = 0,leftBorderSum = 0; for(int i = center;i >= left;i --){ leftBorderSum += a[i]; if(leftBorderSum > maxLeftBorderSum) maxLeftBorderSum = leftBorderSum; } /*求右段的最大子序列*/ int maxRightBorderSum = 0,rightBorderSum = 0; for(int i = center + 1;i <= right;i ++){ rightBorderSum += a[i]; if(rightBorderSum > maxRightBorderSum) maxRightBorderSum = rightBorderSum; } /*返回左段,右段,中间段三者的最大值*/ return max3(maxLeftSum,maxRightSum,maxLeftBorderSum + maxRightBorderSum); } /*max3方法*/ private static int max3(int maxLeftSum, int maxRightSum, int i) { if(maxLeftSum >= maxRightSum && maxLeftSum >= i) return maxLeftSum; if(maxRightSum >= maxLeftSum && maxRightSum >= i) return maxRightSum; if(i >= maxRightSum && i >= maxLeftSum) return i; else return i; } public static int maxSubSum2(int[] a){ return maxSumRec(a, 0, a.length - 1); } public static void main(String[] args){ int[] a = {4,-3,5,-2,-1,2,6,-2}; System.out.println(maxSubSum2(a)); } }
第三种是最聪明也是最简单的方法了,时间复杂度为O(N),代码简单易懂,用thisSum来记录每一次累加的结果,如果大于maxSum,就让maxSum = thisSum,如果thisSum小于0,便让thisSum重新清零,如此从头遍历到尾即可。
public class MaxSubSum3 { public static int maxSubSum3(int[] a){ int maxSum = 0,thisSum = 0; for(int i = 0;i < a.length;i ++){ thisSum += a[i]; if(thisSum > maxSum) maxSum = thisSum; if(thisSum < 0) thisSum = 0; } return maxSum; } public static void main(String[] args){ int[] a = {4,-3,5,-2,-1,2,6,-2}; System.out.println(maxSubSum3(a)); } }
相关文章推荐
- 最大子列和问题的四种不同时间复杂度的算法实现
- 数据结构和算法学习系列之最大子序列求和问题的O(N)时间复杂度
- 数组连续子序列的最大的和;四种算法,四种时间复杂度
- 求最大连续子列和的算法和时间复杂度的分析(包含四种不同时间复杂度的算法)
- 算法-子数组连续序列最大和其时间复杂度如何从O(n^3)到O(n)
- 最大子序列和的线性时间算法
- 最大子数组 三种不同复杂度的算法
- 最大子序列和问题(4种方法,按时间复杂度)
- 求最大子序列的线性时间复杂度的解法的理解
- (C#)找出数组中最大子序列之和,分别以O(N^2),O(NlogN),O(N) 这3种时间复杂度求解
- 最大子序列和的四种不同复杂度实现
- 数组连续子序列的最大的和-四种算法,四种时间复杂度
- 求最大子序列和的四种经典方法及其算法时间复杂度分析
- 给一个由n-1个整数组成的未排序的序列,其元素都是1~n中的不同的整数。如何在线性时间复杂度内寻找序列中缺失的整数
- 最大子序列和的四种不同复杂度实现
- 算法与数据结构——时间复杂度验证:最大子序列问题 Max Subsequence Sum
- 最大子段和算法 不同复杂度方法实现
- 【算法数据结构Java实现】时间复杂度为O(n)的最大和序列
- 最大子序列和的四种求解算法及其时间比较
- 求解最大子序列和问题的线性时间算法