最大子序列和
2015-08-17 11:08
232 查看
最大子序列和的4种算法
给定整数A1,A2…An(可能有负数)求最大子序列和。(假设所有整数均为负数时,最大子序列和为0)Arg1
public int MaxSubsequenceSum(int arr[], int n) { int ThisSum, MaxSum; MaxSum = 0; for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { ThisSum = 0; for (int k = i; k <= j; k++) ThisSum += arr[k]; if (ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; }
时间复杂度O(N3)
Arg2
public int MaxSubsequenceSum(int arr[], int n) { int ThisSum, MaxSum; MaxSum = 0; for (int i = 0; i < n; i++) { ThisSum = 0; for (int j = i; j < n; j++) { ThisSum += arr[j]; if (ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; }
时间复杂度O(N2)
Arg3
分治法的思想,“分”:将问题分成两个大致相同的子问题,然后递归的解决
“治”:将两个子问题的解合并。
在本例中,最大子序列和可能出现在3处:左半部,右半部,占据左右两个部分。
前两种情况可以递归求解。后一种情况可以通过求出前半部的最大和(包含最后一个元素)以及后半部的最大和(包含第一个元素),然后相加。
如:4,-3,5,-2,-1,2,6,-2。
第一种情况的最大和为6(A1-A3)
第二种情况的最大和为8(A6-A7)
第三种情况的最大和为11(A1-A7)
public int MaxSubsequenceSum(int arr[], int left, int right) { int MaxLeftSum, MaxRightSum; int MaxLeftBorderSum, MaxRightBorderSum; int LeftBorderSum, RightBorderSum; int Center, i; if (left == right) { if (arr[left] > 0) return arr[left]; else return 0; } Center = (left + right) / 2; MaxLeftSum = MaxSubsequenceSum(arr, left, Center); MaxRightSum = MaxSubsequenceSum(arr, Center + 1, right); MaxLeftBorderSum = 0; LeftBorderSum = 0; MaxRightBorderSum = 0; RightBorderSum = 0; for (i = Center; i >= left; i--) { LeftBorderSum += arr[i]; if (LeftBorderSum > MaxLeftBorderSum) MaxLeftBorderSum = LeftBorderSum; } for (i = Center + 1; i <= right; i++) { RightBorderSum += arr[i]; if (RightBorderSum > MaxRightBorderSum) MaxRightBorderSum = RightBorderSum; } int max = MaxLeftSum; if (MaxRightSum > max) max = MaxRightSum; if (max < (MaxRightBorderSum + MaxLeftBorderSum)) max = MaxRightBorderSum + MaxLeftBorderSum; return max; }
时间复杂度O(NlogN).
Arg4
public int MaxSubsequenceSum(int arr[], int n) { int ThisSum=0,MaxSum=0; for(int j=0;j<n;j++){ ThisSum+=arr[j]; if(ThisSum>MaxSum) MaxSum=ThisSum; else if(ThisSum<0) ThisSum=0; } return MaxSum; }
时间复杂度:线性时间O(N).
相关文章推荐
- 正则表达式
- 程序员保值的五个关键点
- Java细节:字符串的拼接
- window.close()取消提醒框
- MTK 编译错误,perl 找不到 WIN32/OLE.pm
- Web Server使用IIS读取共享文件
- jdk安装
- C#根据日期DateTime和持续时间int找到日期
- hdu 1068 Girls and Boys(二分图匹配)
- Delphi结构体的扩展,可以自动初始化,反初始化,自定义拷贝函数.
- 线程间通讯
- Android Studio 视频教程地址
- Group Anagrams
- unity3d摄像机碰到后面物体缩进视口
- unity中使用FingerGestures插件3.0
- 1079. Total Sales of Supply Chain (25)
- 使用android不能分享资源的问题
- 十大热门职位公布 高薪行业一目了然
- 在cocos2d-x在CCTableView使用控制
- flex box布局