题目描述:
输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。

#include<stdio.h>
#include<malloc.h>
#include<assert.h> int max_subarray_sum(int * a, int num)
{ assert(a);
int sum = 0; //遍历数组值,存放和值
int max =a[0]; //存放当前的子数组的最大值
int j = 0; //记录当前i的位置
int i; //遍历数组的计数器 for(i = 0; i < num; ) //循环遍历数组
{
sum = sum + a[i]; if(sum > max) //如果相加的结果大于max,就更新max,记录下当前i的位置
{
max = sum;
i++;
j=i;
}
else if( sum < 0) //如果sum的值小于0,就代表之前的子数组相加结果不理想,sum归零,从下一个i开始重新算
{
sum = 0;
i = j;
i++;
}
else //此处代表这,sum的值没有打过max,但sum的值也没有小于零:遇到了一个非正数,可能下个数就是更大的整数,所以继续循序
i++;
j=i; }
if(i = num-1 && max < 0) //这个可以避免全部是负数的情况
{
for(i = 1; i < num; i++)
{
if(a[i] >max)
max = a[i];
}
}
return max;
} int main( )
{
int a[] = {-3,-2,0};
int num = sizeof(a)/sizeof(int);
int max_subarray_sum = max_subarray_sum( a, num);
printf("%d\n",max_subarrya_sum);
return 0;
}
//copyright@ July
//July、updated,2011.05.25。
#include <iostream.h>
#define n 4 //多定义了一个变量 int maxsum(int a[n])
//于此处,你能看到上述思路2代码(指针)的优势
{
int max=a[0]; //全负情况,返回最大数
int sum=0;
for(int j=0;j<n;j++)
{
if(sum>=0) //如果加上某个元素,sum>=0的话,就加
sum+=a[j];
else
sum=a[j]; //如果加上某个元素,sum<0了,就不加
if(sum>max)
max=sum;
}
return max;
} int main()
{
int a[]={-1,-2,-3,-4};
cout<<maxsum(a)<<endl;
return 0;
}

H面试(23):求子数组最大和的更多相关文章

  1. 【算法Everyday】第二日 求子数组的最大和

    题目 // 3.求子数组的最大和 // 题目: // 输入一个整形数组,数组里有正数也有负数. // 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. // 求所有子数组的和的最大值. ...

  2. 求子数组的最大和要求O(n)

    //求子数组的最大和 //输入一个整形数组.有整数也有负数,数组中连续一个或多个子数组,每一个子数组都有一个和,求全部子数组的和的最大值,要求时间复杂度O(n) #include<iostrea ...

  3. 【Data Structure & Algorithm】求子数组的最大和

    求子数组的最大和 题目:输入一个整型数组,数组里有正数和负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值,要求时间复杂度为O(n).例如输入数组为1, - ...

  4. Maximum Subarray 连续子数组最大和

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

  5. 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题

    主要讲第五课的内容前缀树应用和第六课内容暴力递归改动态规划的最全步骤 第一题 给定一个数组,求子数组的最大异或和. 一个数组的异或和为,数组中所有的数异或起来的结果. 简单的前缀树应用 暴力方法: 先 ...

  6. 剑指Offer29 连续子数组最大和

    /************************************************************************* > File Name: 29_Greate ...

  7. 连续子数组最大和(python)

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  8. 【剑指offer】连续子数组最大和

    思路dp很清楚,就是要注意细节. int FindGreatestSumOfSubArray(vector<int> array) { ; ], tempsum = array[]; // ...

  9. 【IT笔试面试题整理】连续子数组的最大和

    [试题描述]输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n). 思路:当我们加上一个正数时,和会增加:当我们加上一个 ...

随机推荐

  1. Codeforces Round #358 (Div. 2) B. Alyona and Mex 水题

    B. Alyona and Mex 题目连接: http://www.codeforces.com/contest/682/problem/B Description Someone gave Aly ...

  2. Jmeter实现对mysql的增、删、改、查

    1.          创建一个存储过程,语句如下: DELIMITER $$; DROP PROCEDURE IF EXISTS test; create PROCEDURE test() BEGI ...

  3. SQLite3知识(1)--教程

    1.SQLite3教程 [1].SQLite 教程 2.选择数据库: [2]. SQLite Select 语句 3.更新数据库: [3]. SQLite Update 语句 4.插入数据库: [4] ...

  4. 华为S5300系列升级固件S5300SI-V100R003C00SPC301.cc

    这个固件是升级V100R005的中间件,所以是必经的,注意,这个固件带有http的服务,但现在无论官网还是外面,几乎找不到这个固件的web功能,如果非要实现,可以拿V100R005的web文件改名为w ...

  5. 亚马逊API的使用

    如上文所说,一个日本友人想要在亚马逊开店,托我帮他做一个小应用.他想实现的主要功能是,定时获取某个商品的最低价,如果这个价格不在他设定的范围内了,就给他发送邮件提醒. 为了帮助我完成程序,他还给我找到 ...

  6. Win8开机直接进桌面方法

    最新的Win8系统由于新增开始屏幕(UI)界面,专门为触摸设备准备,并且很多喜欢尝鲜的电脑爱好者朋友在我们传统的电脑上安装了Win8系统,不少PC用户开始都不喜欢Win8开机后进入UI界面而非传统的电 ...

  7. 《C预处理》Linux内核中可变参数宏的用法

    http://blog.csdn.net/tankai19880619/article/details/12015305

  8. 【从零学习openCV】IOS7人脸识别实战

    前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集 ...

  9. ajax访问遇到Session失效问题

    最近由于一个项目,模块切换为ajax请求数据,当Session失效后,ajax请 求后没有返回值,只有响应的html:<html><script type='text/javascr ...

  10. 咏南WEB框架群集

    咏南WEB框架群集 咏南WEB框架支持群集部署,支持负载均衡和自动故障转移. 咏南WEB群集部署在阿里云服务器上面. 在线测试:http://47.106.93.126:9999/