连续子数组的最大和
2016-03-18 12:04
441 查看
题目:输入一个整型数组,数组里面有正数也有负数。数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为o(n)。 解析:例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。 方法一:时间复杂度为o(n*n*n)的解法,枚举数组的所有子数组并求出它们的和。
int FindGreatestSumOfSubArray(vector<int> &ve) { int sumMax = -1; for (int k = 0; k < ve.size(); ++k) { for (int i = 0; i < ve.size() - k; ++i) { int sumCur = 0; for (int j = i; j < ve.size() - k; ++j) { sumCur += ve[j]; } if (sumMax < sumCur) { sumMax = sumCur; } } } return sumMax; }方法二:时间复杂度为o(n*n)的解法,同样也是枚举所有的情况,用到了上一次求值的结构。把o(n*n*n)降低为o(n*n)。
int FindGreatestSumOfSubArray(vector<int> ve) { int size = ve.size(); int sum_max = 0x80000000; for (int i = 0; i < size; ++i) { int sum_cur = 0; for (int j = i; j < size; ++j) { sum_cur += ve[j]; if (sum_max < sum_cur) sum_max = sum_cur; } } return sum_max; }方法三:时间复杂度为o(n)。
int FindGreatestSumOfSubArray(vector<int> array) { int size = array.size(); //数组长度为0时,返回0 if(size == 0) return 0; //当前连续子数组的最大和 int sum_max = 0x80000000; //以当前元素结尾的连续子数组最大和 int sum_sub_max = 0; for(int i = 0; i < size; ++i){ if(sum_sub_max <= 0){ sum_sub_max = array[i]; } else{ sum_sub_max += array[i]; } if(sum_max < sum_sub_max){ sum_max = sum_sub_max; } } return sum_max; }
相关文章推荐
- Qt5.5.1 (Qt5.x) Creator 无法输入中文(fcitx,搜狗输入法)
- 理清关于iOS各个证书的关系以及作用
- 软件测试 实验一(测试三角形)
- [Android]基于Android的Java学习路线图
- Sqlserver 平面文件导入/ SSIS FlatFileSource导入文件时 出现LocaleID is not installed报错问题
- Package filename.rpm is not signed的解决办法
- VS2012 快捷键
- Android TextureView OpenGL场景
- Rafy 框架 - 流水号插件
- Symfony2函数用法实例分析
- iOS多线程之NSThread
- Activity向Fragment传值
- zabbix 自定义 key
- 网易游戏技术岗在线编程题(二)
- 浅析Python基础-流程控制
- BaskSpace键控制
- 温故3:Java集合框架中的几个常用接口
- ubuntu 花屏、卡死
- mac os安装wget
- 网易游戏技术岗在线编程题(二)