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

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

但其中是可以有优化的

如 子数组【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. jQuery 监控键盘一段时间内没输入

    监控一段时间没输入可用于简单的输入完成 上次实现了一个模拟输入完成则发送请求到后台获取数据的并显示到前台的问题,其中核心的判断标准是输入完成的定义. 即:用户怎么算输入完成. 我使用的标准是,当一个文 ...

  2. .NET 可选择的转型路径(转)

    新的一年,您在学习和工作上,想坚守所学,还是尝试转型呢? (1) 继续钻研 C# 4.0 / AJAX / LINQ to AD.LINQ to JavaScript / WF, WCF, WPF, ...

  3. 理解CSS中BFC

    BFC(Block Formatting Context) 是Web页面中盒模型布局的CSS渲染模式.它的定位体系 属于 常规文档流 .摘自 W3C : 浮动,绝对定位元素, inline-block ...

  4. Html.ActionLink

    一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是该链接要显示的文字,第二个参数是对应的控制器的方法, ...

  5. 【Uploadify】远程上传图片到【七牛云存储】

    1.下载Uploadify版本3.2.1 2.下载七牛SDK 解压后将 qiniu 文件夹copy到uploadify文件夹下 3.修改uploadify.php文件 <?php $verify ...

  6. linux修改登陆后进入的默认目录

    如将root登陆后进入的路径由/root改为/opt/FriendlyARM/linux/u-boot-mini6410修改/etc/pssswd 修改行 root:x:0:0:root:/root: ...

  7. centos -bash-4.1$ 不显示用户名路径

    1.在Terminal输入: vi ~/.bash_profile 2.如果没有.bash_profile可以自己添加.然后往文件中添加如下内容: export PS1=’[\u@\h \W]$ 注意 ...

  8. WinRt BottomAppBar

    BottomAppBarDemo.xaml <Page.BottomAppBar> <AppBar> <StackPanel Orientation="Hori ...

  9. IOS屏幕布局

    1.iPad和iPhone的屏幕布局 在IB中,屏幕或控件的尺寸以点为单位.在视网膜技术中,1个点包括4个像素,而没有采用视网膜屏幕技术的还是1个点包括1个像素. 2.绝对布局和相对布局 3.使用Au ...

  10. kettle的job

    1.首先创建一个job 2.拖拽组件形成下面的图 这里需要注意,在作业中的连线分为三类: 黄色锁的线:这个步骤执行之后,无论失败与否都会执行下一个步骤 绿色对号线:步骤执行成功了,才会执行下一个步骤. ...