文章标题
2015-08-18 14:59
330 查看
求连续区间的最大子序列和
问题
解下面一个事例例如,在一维数组的连续区间中找出其总和最大的连续区间。例如:input: [-7,4,-3,6,3,-8,3,4]
output: 10
方法
求最大子序列和是一个非常常见的问题,由于本人刚学习算法不久,只用常见的几种方法进行尝试。穷举法
时间复杂度为O(N.^3)穷举法,减去一些不必要比较
时间复杂度为O(N.^2)分治法
时间复杂度为O(NlgN)代码如下:
#include <iostream> #include <vector> #include <limits> using namespace std; const int MIN = numeric_limits<int>::min(); //时间复杂度为O(N.^3) int inefficientMaxSum(vector<int>& A) { int N = A.size(); int ret = MIN; for(int i = 0; i < N; i++) { for(int j=0; j < N; j++) { int sum = 0; for(int k = i; k < j+1; k++) { sum += A[k]; } ret = max(ret,sum); } } return ret; } int betterMaxSum(vector<int>& A) { int N = A.size(),ret = MIN; for(int i = 0;i < N;i++) { int sum = 0; for(int j = i; j<N; j++) { sum +=A[j]; ret = max(ret,sum); } } return ret; } int fastMaxSum(vector<int> &A,int lo, int hi) { if(lo == hi) return A[lo]; int mid = (lo + hi) / 2; int leftSum = MIN, rightSum = MIN, sum = 0; for(int i = lo; i <= mid; i++) { sum += A[i]; leftSum = max(leftSum,sum); } /* for(int i = mid; i>= lo; --i) { sum += A[i]; leftSum = max(leftSum,sum); } */ sum = 0; for(int j = mid+1; j <= hi; j++) { sum += A[j]; rightSum = max(rightSum,sum); } //return max(leftSum,rightSum); int single = max(fastMaxSum(A,lo,mid),fastMaxSum(A,mid+1,hi)); return max(leftSum+rightSum,single); } int main() { int a[8] = {-7,4,-3,6,3,-8,3,4}; vector<int> A; for(int i=0; i<8; i++) { A.push_back(a[i]); } cout << "max_sum:" << inefficientMaxSum(A)<<endl; cout <<"max_sum2:" << betterMaxSum(A) <<endl; cout <<"max_sum3:" << fastMaxSum(A,0,7) <<endl; cout << "Hello world!" << endl; return 0; }
相关文章推荐
- 理解Linux系统中的load average(图文版)
- boost::asio网文收集
- tabBar颜色修改
- GP 环境参数名称列表
- 数据库设计三大范式
- 过滤特殊危险字符
- c语言实现各种排序算法
- Architecting Backend For A Social Product
- Extjs按钮的隐藏、显示、禁用,启用,去除加载朦层
- [VS debug] C++ new做的工作
- mysql查询结果合并
- 选择排序
- 曾经的笔记迁移__自己封装的通用链表_简单实用
- 同步请求和异步请求
- python的import与from...import的不同之处
- IOS开发学习(1)-IOS应用程序周期
- 浅谈CSS3 Filter的10种特效
- 华为3G模块拨号上网
- 使用cocoadPod updating local specs repositories 卡住
- 华为OJ 字符串加解密