《编程之法》:最大连续子数组和
来源:互联网 发布:centos多线程下载命令 编辑:程序博客网 时间:2024/06/05 06:21
题目
给定一个整数数组,数组里可能有正数、负数和零。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如,如果输入的数组为{1,-2,3,10,-4,7,2,-5},那么和为最大的连续子数组为{3,10,-4,7,2},和为18。
思路
使用动态规划的思想。令currSum是以当前元素结尾的最大连续子数组的和,maxSum是全局的最大子数组的和,当往后扫描时,对第i个元素有两种选择,要么放入前面找到的子数组,要么作为新子数组的第一个元素:如果currSum>0,则令currSum加上array[i];如果currSum<=0,则currSum被置为当前元素,即currSum=array[i]。而对于maxSum,则若maxSum < currSum,则更新maxSum=currSum,否则maxSum保持原值,不更新。
代码
//// Created by huxijie on 17-3-18.// 最大连续子数组的和#include <iostream>using namespace std;int MaxSubArraySum(int array[],int n) { int from,to; //记录所求子数组的首尾下标 int curSum = 0, maxSum = 0; for (int i = 0; i < n; ++i) { if (curSum > 0) { curSum += array[i]; if (maxSum < curSum) { to = i; maxSum = curSum; } } else { curSum = array[i]; if (maxSum < curSum) { from = i; maxSum = curSum; } } } int j; for (j = from; j < to ; ++j) { cout<<array[j]; if (array[j + 1] >= 0) { cout << "+"; } } cout << array[j] << "=" << maxSum << endl;}int main() { int n =8; int array[] = {1, -2, 3, 10, -4, 7, 2, -5}; MaxSubArraySum(array, n); return 0;}
运行结果
3+10-4+7+2=18Process finished with exit code 0
0 0
- 【编程之法】最大连续子数组和
- 《编程之法》:最大连续子数组和
- 剑指offer-连续子数组的最大和----编程之美-连续子数组的最大和
- 连续子数组最大和
- 连续最大子数组和
- 连续子数组最大和
- 最大连续子数组和
- 连续子数组最大和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和。
- 最大子数组和(连续)
- STM32的硬件I2C到底坑不坑?
- 网络维护--路由器设置---fir302c(phicomm)
- python服务器环境搭建(1)——本地服务器准备
- 第2周 项目3 小试循环
- Java父子类在生成对象时的属性关系
- 《编程之法》:最大连续子数组和
- [Python模块学习]用sndhdr模块识别音频格式
- 基于SystemBarTint、BottomNavigationBar实现的一个简单的项目框架
- mysql创建用户和授予权限
- 超级表格教你怎样“零”成本制作签到系统
- Vitamio多媒体开发框架
- 鸟哥的linux私房菜学习笔记《二十八》PAM模块
- 模拟借书系统
- 496. Next Greater Element I