博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大子数组和
阅读量:5778 次
发布时间:2019-06-18

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

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。

  看到这个题目,我们首先想到的是求出这个整型数组所有连续子数组的和,长度为n的数组一共有 n(n+2)/2个子数组,因此要求出这些连续子数组的和最快也需要O(n^2)的时间复杂度。但是题目要求的O(n)的时间复杂度,因此上述思路不能解决问题。

使用动态规划方法

  解体思路:如果用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max(f[0...n])。我们可以给出如下递归公式求f(i)

  这个公式的意义:

  1. 当以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)小于0时,如果把这个负数和第i个数相加,得到的结果反而不第i个数本身还要小,所以这种情况下最大子数组和是第i个数本身。
  2. 如果以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)大于0,与第i个数累加就得到了以第i个数结尾的子数组中所有数字的和。

代码实现

//使用动态规划求最大连续子数组和int FindGreatestSumOfSubArray2(int arry[],int len,int c[]) { c[0]=arry[0]; int start,end; int temp=0; int maxGreatSum=-100; for(int i=1;i
maxGreatSum) { maxGreatSum=c[i]; start=temp; end=i; } } //输出c[i] for(int i=0;i

  其实上述两种方法的实现方式非常相似,只是解体思路不同而已。通常我们会使用递归的方式分析动态规划的问题,但是最终都会基于循环去写代码。在动态规划方法中创建了一个数组c[]用于存储中间结果,而第一种方法中只需要一个临时变量currSum.

转载于:https://www.cnblogs.com/wxgblogs/p/5790596.html

你可能感兴趣的文章
实用的sublime插件集合 – sublime推荐必备插件
查看>>
我的友情链接
查看>>
QPS和TPS解释
查看>>
为什么要使用tomcat+memcache实现session共享而不使用会话保持
查看>>
10个linux 作业控制的bash 脚本示例
查看>>
一个Web报表项目的性能分析和优化实践(六):设置MySQL的最大连接数(max_connections)...
查看>>
RSA加密算法的简单案例
查看>>
XMLHttpRequest对象如何兼容各浏览器使用?
查看>>
perl智能匹配操作符~~
查看>>
ASCII码对照表
查看>>
每天一个linux命令(22):find 命令的参数详解
查看>>
MySQL修改root密码的各种方法整理
查看>>
虚拟机类加载机制
查看>>
【Quick-Cocos2d-x】 捋一捋框架流程
查看>>
Long基本类型的三个静态方法(java)
查看>>
Siege的源码二次开发&操作手册
查看>>
ECstore meta扩展
查看>>
Oracle 学习之RAC(四) 安装Oracle软件
查看>>
Go Interface
查看>>
apache 403 Forbidden
查看>>