连续子数组的最大和
来源:互联网 发布:电视机看电视软件 编辑:程序博客网 时间:2024/05/01 11:26
题目:输入一个整型数组,数组里面有正数也有负数。数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为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时,返回0if(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; }
0 0
- 数组连续子数组的和最大
- 数组连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- (8)连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- zabbix 自定义 key
- WindowsServer2008 R2 Enterprise(ServerCore) + SqlServer2008 R2
- 使用DbVisualizer导出DB2创建序列SQL
- wordpress站点地址配置错误,无法访问网站
- Activity向Fragment传值
- 连续子数组的最大和
- 集合框架和泛型
- uCOS-II中Event阻塞、唤醒、超时机制(以Sem为例)
- FCM(Fuzzy C-Means)模糊C聚类
- BZoj 2190: [SDOI2008]仪仗队【欧拉函数】
- [Android]基于Android的Java学习路线图
- 如何在Linux上搭建VisualSVN Server(svn服务端)
- 机房重构—策略模式简单用
- 《活着就为改变世界:史蒂夫.乔布斯转》读书分享