看到这个题目,我首先想到就是暴力解决

求出所有的子数组的和,取出最大值即可

但其中是可以有优化的

如 子数组【3:6】可以用【3:5】+【6】来计算

即可以将前面的计算结果保留下来,减少后面的重复计算

我是用C++实现的

代码如下

 #include <iostream>

 /*
求出所有字串和,取最大值
其中sun为用来存放结果的数组
后面的字串和可由前面的字串和再加一个数得到
可以减少运算次数
*/
int maxSum0(int* a,int n){
int sum[][];
int max = ;
for(int i=; i<n; i++){
sum[][i] = a[i];
std::cout<<a[i]<<" ";
if(max < a[i])
max = a[i];
}
std::cout<<std::endl; for(int i=; i<n; i++){
for(int j=i;j<n;j++){
sum[i][j] = sum[i-][j-]+sum[][j];
std::cout<<sum[i][j]<<" ";
if(max < sum[i][j])
max = sum[i][j];
}
std::cout<<"\n";
}
return max;
} int main(){
int a[]={, -, , , -, , , -, -};
std::cout<<maxSum0(a,)<<std::endl;
return ;
}

测试结果

我把所有子数组和都打印出来了,结果是正确的

分析

我的算法时间复杂度应该是O(n^2),因为在做子数组求和运算过程中,每一个子数组求和都只需要做一次加法运算就可得到,子数组一共为n*(n+1)/2个

所以时间复杂度为O(n^2)

网上别人的好方法

这是我在http://blog.csdn.net/v_JULY_v/article/details/6444021上看到的

时间复杂度读仅为O(n)

 /*
我看着这代码总觉的写的太简单了、、、
可是测试结果都没错。。 每一次累加到小于零的子串和时就从新开始
*/
int maxSum1(int* a, int n){
int max=;
int b=;
for(int i=; i<n; i++)
{
if(b<)
b=a[i];
else
b+=a[i];
if(max<b)
max=b;
}
return max;
}

这方法很不错,我就转过来了。

homework-01 "最大子数组之和"的解决过程的更多相关文章

  1. homework-01 "最大子数组之和"的问题求解过程

    写在前面:我的算法能力很弱,并且也是第一次写博文,总之希望自己能在这次的课程中学到很多贴近实践的东西吧. 1.这次的程序是python写的,这也算是我第一次正正经经地拿python来写东西,结果上来说 ...

  2. homework-02 "最大子数组之和"的问题进阶

    代码编写 这次的作业瞬间难了好多,无论是问题本身的难度或者是单元测试这一原来没接触过的概念或者是命令行参数的处理这些琐碎的问题,都使得这次作业的完成说不上轻松. 最大子数组之和垂直水平相连的拓展问题解 ...

  3. 求一个二维整数数组最大子数组之和,时间复杂度为N^2

    本随笔只由于时间原因,我就只写写思想了 二维数组最大子数组之和,可以  引用  一维最大子数组之和 的思想一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组a[n ...

  4. [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

  5. 求一个整数数组最大子数组之和,时间复杂度为N

    #include<iostream.h> int main () { ]={-,-,-,-,-,-,-,-,-,-}; ],sum=; ;i<;i++) { ) { sum=b[i] ...

  6. [Swift]LeetCode325. 最大子数组之和为k $ Maximum Size Subarray Sum Equals k

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

  7. 最大子数组之和(N)

    int maxSum(int *array, int n) { ]; ; ; ; i < n; i++) { ) newsum += array[i]; else newsum = array[ ...

  8. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  9. [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积

    Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...

随机推荐

  1. AJAX验证用户是否存在

    <html> <head> <title> ajax验证 </title> </head> <body> <input t ...

  2. 十一、Struts2封装请求参数的方式

    十一.Struts2封装请求参数的方式 方式一.Action 本身作为model对象,通过成员setter封装(一个名字为params的拦截器干的) 注意:表单中的名称要和动作类中的名称一致(这是必须 ...

  3. php实现在线下载程序安装包功能

    在线下载程序安装包可以很方便在服务器端下载各种程序安装包(Discuz!.phpwind.Dedecms.WordPress....等一些常用程序)并存储在服务器,大大减少站长上传程序安装包时间.默认 ...

  4. JavaScript高级 面向对象的程序设计 (一)《JavaScript高级程序设计(第三版)》

    创建对象 继承 面向对象的语言都有一个表示---类.通过类我们可以创建多个具有相同属性的对象.但是,在JS中并没有类的概念,所以JS的对象也和其他语言的对象不同. 对象的定义:无序的属性集合,其属性可 ...

  5. 在centos下安装django

    这里有一个不错的Django的学习资料.先收藏一下,以备后用.谢谢 http://www.ziqiangxuetang.com/django/django-install.html 在centos下安 ...

  6. 缓存一致性(Cache Coherency)入门

    作者: Fabian “ryg” Giesen  来源: infoq 参考原文:http://fgiesen.wordpress.com/2014/07/07/cache-coherency/ 本文是 ...

  7. 我都使用了这些VS插件

    VS作为一个.net开发的必备工具,当然有必要将其打造成一个利器!所以,安装一些必要的插件来增强它是最佳的选择! 首先不得不说一下,Resharper太有用了! 接下来的这一些插件,对我来说,也都是比 ...

  8. ADO .NET 链接 增删改查

    ADO.NET: 数据访问技术 就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中也可以将数据库中的数据提取到内存中供程序调用 所有数据访问技术的基础 连 ...

  9. C#中判断文件夹中存在某个txt文本

    strFileName="D:\\strarray.txt"; if (File.Exists(strFileName))//判断文件是否存在 { }

  10. div+css+jQuery图片横向滚动代码(带左右点击按钮)

    首先感谢Blue老师的javascript教程,给了我很多的启发,这是我在看完10 - 定时器的使用 - 2这节视频后,自己试着用jQuery重新改写了一下代码,感觉至少比百度搜出来的那一坨靠谱多了, ...