求数列的最大子段和的两种方法(包括时间复杂度为线性时间的算法)
来源:互联网 发布:大数据imf 编辑:程序博客网 时间:2024/05/17 08:10
方法一:
C++代码:
#include <iostream>#include <vector>using namespace std;int max_sub_sum(const vector<int> &v, int &best_i, int &best_j){ int n = v.size(); //当前最大子段和 int sum = 0; //当前字段和 int this_sum = 0; int i,j; for (i=0,j=0;j<n;++j) { this_sum += v[j]; if (this_sum >= sum) { sum = this_sum; best_i = i; best_j = j; } else if (this_sum < 0) { this_sum = 0; i = j+1; } } return sum;}int main(){ vector<int> v; v.push_back(-1); v.push_back(5); v.push_back(-2); v.push_back(-1); v.push_back(4); v.push_back(1); v.push_back(-3); v.push_back(1); v.push_back(-2); v.push_back(1); /*v.push_back(1); v.push_back(-2); v.push_back(3); v.push_back(10); v.push_back(-4); v.push_back(7); v.push_back(2); v.push_back(-5);*/ for (int i=0;i<v.size();++i) { cout<<v[i]<<' '; } cout<<endl; int best_i=1; int best_j=0; int max_sum = max_sub_sum(v,best_i,best_j); if (best_i > best_j) { cout<<"最大子段和为:"<<max_sum<<endl; } else { cout<<"最大子段和为:"<<max_sum<<endl; cout<<"最大子段为:"; for (int i=best_i;i<=best_j;++i) { cout<<v[i]<<' '; } } cout<<endl; return 0;}
运行结果:
方法二:
分析:这种情况为二分法不独立的情况,子问题重叠。
C++源代码:
#include <iostream>#include <vector>#include <ctime>using namespace std;int max_sub_sum(vector<int> v,int i, int j){ if ( i == j) { if (v[i]>0) { return v[i]; } return 0; } int mid = (i+j)/2; int l_sub_sum = max_sub_sum(v,i,mid); int r_sub_sum = max_sub_sum(v,mid+1,j); int current_lsum = v[mid]; int max_lsum = v[mid]; for (int i=mid-1;i>=0;--i) { current_lsum += v[i]; if (current_lsum > max_lsum) { max_lsum = current_lsum; } } int max_rsum = v[mid+1]; int current_rsum = v[mid+1]; for (int i=mid+2;i<=j;++i) { current_rsum += v[i]; if (current_rsum > max_rsum) { max_rsum = current_rsum; } } int mid_sub_sum = max_lsum+max_rsum; if (l_sub_sum>mid_sub_sum && l_sub_sum>r_sub_sum) { return l_sub_sum; } else if (mid_sub_sum>l_sub_sum && mid_sub_sum>r_sub_sum) { return mid_sub_sum; } return r_sub_sum;}int main(){ vector<int> v; v.push_back(-1); v.push_back(5); v.push_back(-2); v.push_back(-1); v.push_back(4); v.push_back(1); v.push_back(-3); v.push_back(1); v.push_back(-2); v.push_back(1); for (int i=0;i<v.size();++i) { cout<<v[i]<<' '; } cout<<endl; cout<<max_sub_sum(v,0,v.size()-1)<<endl; return 0;}
测试结果:
0 0
- 求数列的最大子段和的两种方法(包括时间复杂度为线性时间的算法)
- 求一个整型数组的最大和的子数列,要求时间复杂度为线性的
- 求最大子序列和的四种经典方法及其算法时间复杂度分析
- 时间复杂度为O(N)的求最大子序列和的算法
- 求最大连续子列和的算法和时间复杂度的分析(包含四种不同时间复杂度的算法)
- 求数组的最大子段和,动态规划 时间复杂度O(n)
- 线性时间求最大回文子串的Manacher算法
- 求最大子序列的线性时间复杂度的解法的理解
- 最大子序列和的线性时间算法
- 求解最大子序列和问题的线性时间算法
- 数组连续子序列的最大的和-四种算法,四种时间复杂度
- 数组连续子序列的最大的和;四种算法,四种时间复杂度
- 最大子列和问题的四种不同时间复杂度的算法实现
- 最大子序列和问题的求解(时间复杂度为O(N))
- 二分法求数列的最大子段和问题
- MIT:算法导论——2.渐近符号、递归及解法_和连续子数组的最大和、主方法/主定理求时间复杂度
- 在线性时间和空间复杂度内,求大小相邻两元素之差的最大值
- 最大子序列的不同时间复杂度算法
- equals和==的区别
- cap解释
- android(NDK+JNI)---JNI字符串参数传递与返回值
- Oracle内存结构
- Android乱码
- 求数列的最大子段和的两种方法(包括时间复杂度为线性时间的算法)
- android AsyncQueryHandler的分析
- 53. Maximum Subarray
- 安卓-获取图片/视频的缩略图
- 图论复习笔记
- STM32系列第16篇--RTC实时时钟
- 超简单Nsoup版Csdn博客爬虫
- Hibernate高级配置
- TCP/IP(四)ICMP协议,ping和Traceroute