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

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

求所有子数组的和的最大值。要求时间复杂度为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 #228 (Div. 1) B. Fox and Minimal path 构造

    B. Fox and Minimal path 题目连接: http://codeforces.com/contest/388/problem/B Description Fox Ciel wants ...

  2. SCP用法

    scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port ...

  3. vue中路由返回上一个页面,恢复到上一个页面的滚动位置

    第一步:路由文件的配置(对你所需要的vue文件进行保存缓存标志的添加) import Vue from 'vue' import Router from 'vue-router' import Hel ...

  4. ibatis实战之中的一个对多关联

    在实际开发中,我们经常遇到关联数据的情况,如User对象拥有若干Book对象 每一个Book对象描写叙述了归属于一个User信息,这样的情况下,我们应该怎样处理? 通过单独的Statement操作固然 ...

  5. 去除ArcMap连接空间数据库中多余的属性表

    这个操作目前可能不具有可行性,但是为了完整性还是在下面讲一下吧.如有兴趣的小伙伴,可以按照下面的操作方式去尝试. 一.需求 去除ArcMap连接空间数据库中多余的属性表. PL/SQL中查询得到的内容 ...

  6. JAVA JDOM解析XML 带CDATA数据

    import java.io.StringReader;import java.util.*; import org.jdom.Document;import org.jdom.Element;imp ...

  7. 模拟出ios中流行的黑色背景底

    [activityIndicatorView setBackgroundColor:[UIColor colorWithRed: green: blue: alpha:0.4]]; 用上面的语法,可以 ...

  8. table固定首行(一)

    <html> <head> <title>Untitled Document</title> <meta http-equiv="Con ...

  9. 【BZOJ】【1089】【SCOI2003】严格n元树

    高精度/递推 Orz Hzwer…… 然而我想多了…… 理解以后感觉黄学长的递推好精妙啊 顺便学到了一份高精度的板子= =233 引用下题解: f[i]=f[i-1]^n+1 ans=f[d]-f[d ...

  10. OpenCV学习(32) 求轮廓的包围盒

    在OpenCV中,能够很方便的求轮廓包围盒.包括矩形,圆形,椭圆形以及倾斜的矩形(包围面积最小)集中包围盒.用到的四个函数是: Rect boundingRect(InputArray points) ...