博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
连续子数组的最大和(基于动态规划)
阅读量:4677 次
发布时间:2019-06-09

本文共 1628 字,大约阅读时间需要 5 分钟。

题目

  输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。

思路

一般解法

  1. 从头到尾累加数字,保存到一个临时变量curr_sum中
  2. 如果前几项的和为负,则加上此和之后比本身的值还要小,抛弃原来所计算得到的和,curr_sum从本元素开始计数 ;否则,把当前元素累加到curr_sum
  3. 把curr_sum与最大值max_sum比较(max_sum保存每个连续数组的最大和)

#include 
#include
using namespace std;class Solution{ public: int get_max_sum(const vector
&v); bool is_invalid{
true}; };int Solution::get_max_sum(const vector
&v){ if(v.empty()||v.size()<0) { is_invalid=false; return -1; } is_invalid=true; int curr_sum=0;//当前和 int max_sum=0;//保存最大和 for(int i=0;i
max_sum) max_sum=curr_sum; } return max_sum;}int main(){ vector
v{ 1,-2,3,10,-4,7,2,-5}; Solution s; cout<
<

 动态规划

  f(i)表示以第i个数字结尾的子数组的最大和,那么只需求出max[f(i)],状态转移方程如下

v[i],i==0||f(i-1)<0f(i)=      v[i]+f(i-1),i>0&&f(i-1)>0

code:

#include 
#include
using namespace std;class Solution{ public: int get_max_sum(const vector
&v); bool is_invalid{
true}; };int Solution::get_max_sum(const vector
&v){ if(v.empty()||v.size()<0) { is_invalid=false; return -1; } is_invalid=true; int curr_sum=0;//当前和 int max_sum=0;//保存最大和 for(int i=0;i
v{
1,-2,3,10,-4,7,2,-5}; Solution s; if(s.is_invalid) cout<
<

 

转载于:https://www.cnblogs.com/tianzeng/p/10238286.html

你可能感兴趣的文章
WPF中使用USERCONTROL
查看>>
图片,base64 互转
查看>>
ES6 有什么新东西
查看>>
cache—主存—辅存三级调度模拟
查看>>
Java线程的定义
查看>>
UglifyJS 压缩选项
查看>>
面向对象1
查看>>
Python-面向对象(组合、封装与多态)
查看>>
Mininet
查看>>
COSC2531 Programming Fundamentals
查看>>
设计模式系列 - 访问者模式
查看>>
20180507小测
查看>>
前端鼠标点击弹出浮动文字--民主、和谐、爱国、自由等
查看>>
eclipse左侧不见
查看>>
python会缓存小的整数和短小的字符
查看>>
格网与四叉树索引
查看>>
Linux网卡配置文件路径是什么?要使服务器上外网,必须满足的条件有哪些?需要配置什么?...
查看>>
多张照片拍摄、图片浏览
查看>>
html(5) css
查看>>
Azure Web连接到Azure MySql Db
查看>>