求数组最大子序列的和
2016-04-03 18:55
441 查看
题目:给出数组{4,-3,5,-2,-1,2,6,-2},求子序列的最大和。
分别用一下两种方法解决。
分别用一下两种方法解决。
#include <stdio.h> // 方法1: 分治法 //时间复杂度 O(NlogN) int max3(int num1 , int num2 , int num3){ int max = num1; if(max<num2)max= num2; if(max<num3)max=num3; return max; } int maxSubSum(int array[],int start, int end){ int maxLeftSum , maxRightSum; int maxLeftBorderSum,maxRightBorderSum; int leftBorderSum,rightBorderSum; int middle,i; if(start == end){ if(array[start] >0) return array[start]; else return 0; } middle = (start+ end)/2; //递归求解左半部分最大子序列和 maxLeftSum = maxSubSum(array, start, middle); //递归求解右半部分最大子序列和 maxRightSum = maxSubSum(array, middle+1, end); //求解中间部分的最大子序列和 leftBorderSum=0,maxLeftBorderSum=0; for(i = middle;i>=start;i--){ leftBorderSum+=array[i]; if(leftBorderSum>maxLeftBorderSum) maxLeftBorderSum = leftBorderSum; } rightBorderSum =0,maxRightBorderSum=0; for (i=middle+1; i<=end; i++) { rightBorderSum+=array[i]; if(rightBorderSum>maxRightBorderSum){ maxRightBorderSum = rightBorderSum; } } return max3(maxLeftSum, maxRightSum, maxLeftBorderSum+maxRightBorderSum); } //方法2 时间复杂度 o(N) int getMaxSubSum(int array[],int start,int end){ int currentSum = 0, maxSum =0; for(int i = start;i <=end;i++){ currentSum+=array[i]; if(currentSum<0) currentSum= array[i]; if(currentSum>maxSum){ maxSum = currentSum; } } return maxSum; } int main(int argc, const char * argv[]) { // insert code here... int a[] = {4,-3,5,-2,-1,2,6,-2}; //int max = maxSubSum(a, 0, 7); int max = getMaxSubSum(a, 0, 7); printf("%d",max); return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析