转载请注明出处:http://blog.csdn.net/ns_code/article/details/27103959

题目描写叙述:

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU測试组开完会后,他又发话了:在古老的一维模式识别中,经常须要计算连续子向量的最大和,当向量全为正数的时候,问题非常好解决。可是,假设向量中包括负数,是否应该包括某个负数,并期望旁边的正数会弥补它呢?比如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个開始,到第3个为止)。你会不会被他忽悠住?

输入:

输入有多组数据,每组測试数据包括两行。

第一行为一个整数n(0<=n<=100000),当n=0时,输入结束。接下去的一行包括n个整数(我们保证全部整数属于[-1000,1000])。

输出:

相应每一个測试案例,须要输出3个整数单独一行,分别表示连续子向量的最大和、该子向量的第一个元素的下标和最后一个元素的下标。若是存在多个子向量,则输出起始元素下标最小的那个。

例子输入:
3
-1 -3 -2
5
-8 3 2 0 5
8
6 -3 -2 7 -15 1 2 2
0
例子输出:
-1 0 0
10 1 4
8 0 3

前面有专门写了一篇求最大连续子数个组的文章,见这里:http://blog.csdn.net/ns_code/article/details/20942045。这里的第三种做法,要在数组中既有负数又有整数的情况下才干得到正确的结果。而这里的測试例子中有全负的情况,因此,跟上面的求解会有些细节上的不同,并且这里除了要求出最大连续子数组的和,还要求出该最大连续子数组,因此要另设两个变量保存该连续子数组的起始和结束的位置。

AC代码例如以下:

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
bool flag; int MaxSubSum(int *arr,int len,int *indexBegin,int *indexEnd)
{
if(arr==NULL || len<1)
{
flag = false;
return -1;
} int i;
int MaxSum;
int CurSum;
int CurBegin; //当前的CurSum的開始处的索引
int CurEnd; //当前的CurSum的结束处的索引
for(i=0;i<len;i++)
{
if(i == 0)
{
//先用第一个元素初始化
*indexBegin = 0;
*indexEnd = 0;
CurBegin = 0;
CurEnd = 0;
MaxSum = arr[i];
CurSum = arr[i];
}
else
{
//前面的和小于0,抛弃前面的和,从当前元素又一次開始计算
if(CurSum < 0)
{
CurSum = arr[i];
CurBegin = i;
CurEnd = i;
}
else
{
CurSum += arr[i];
CurEnd = i;
}
if(CurSum > MaxSum)
{
MaxSum = CurSum;
//假设当前和大于前面出现的最大和,
//则替换掉最大和的開始索引和结束索引
*indexBegin = CurBegin;
*indexEnd = CurEnd;
}
}
}
return MaxSum;
} int main()
{
int n;
while(scanf("%d",&n)!=EOF && n!=0)
{
int *arr = (int *)malloc(sizeof(int)*n);
if(arr == NULL)
exit(EXIT_FAILURE); int i;
for(i=0;i<n;i++)
scanf("%d",arr+i); flag = true;
int indexBegin,indexEnd;
int result = MaxSubSum(arr,n,&indexBegin,&indexEnd);
if(flag)
{
printf("%d ",result);
printf("%d ",indexBegin);
printf("%d\n",indexEnd);
} free(arr);
arr = NULL;
}
return 0;
}
/**************************************************************
    Problem: 1372
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:450 ms
    Memory:1304 kb
****************************************************************/

【剑指offer】连续子数组的最大和的更多相关文章

  1. 剑指Offer 连续子数组的最大和

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

  2. 用js刷剑指offer(连续子数组的最大和)

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

  3. 剑指Offer——连续子数组的最大和

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

  4. 剑指 Offer——连续子数组的最大和

    1. 题目 2. 解答 初始化 sum=0,然后遍历数组进行累加.如果 sum 变为负数,也就说再继续累加的话贡献为负,我们需要更新 sum=0,重新开始累加. 初始化 max_sum 为数组的第一个 ...

  5. 剑指offer--43.连续子数组的最大和

    最大子段和,最大能取所有 ---------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度 ...

  6. 剑指Offer-30.连续子数组的最大和(C++/Java)

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

  7. 3-剑指Offer: 连续子数组的最大和

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

  8. Python中的sys.stdin和input、sys.stdout与print--附带讲解剑指offer42-连续子数组的最大和

    2020秋招季,终于开始刷第一套真题了,整套试卷就一道编程题,还是剑指offer上的原题,结果答案死活不对,最后干脆直接提交答案算了,看了下别人的答案,原来是输入数据没有获取的原因,不过这个语法sys ...

  9. 剑指offer-连续子数组的最大和-数组-python

    题目描述 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止). 给一个数组,返回它的最大连续子序列的和 思路:动态规划 # -*- coding:u ...

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

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

随机推荐

  1. 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组

    [BZOJ1031][JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的 ...

  2. Segment(技巧 相乘转换成相加 + java)

     Segment Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  3. C# Lazy<T>(转)

    本文来自:http://www.cnblogs.com/zhangpengshou/archive/2012/12/10/2811765.html .NET Framework 4 在一次次跳票中终于 ...

  4. C#listbox使用方法

    1. 属性列表: SelectionMode    组件中条目的选择类型,即多选(Multiple).单选(Single)    Rows             列表框中显示总共多少行    Sel ...

  5. [Redux] Generating Containers with connect() from React Redux (AddTodo)

    Code to be refacted: const AddTodo = (props, { store }) => { let input; return ( <div> < ...

  6. error: ‘for’ loop initial declarations are only allowed in

    使用gcc,出现如下错误: thread_join.c:7:5: error: 'for' loop initial declarations are only allowed in C99 mode ...

  7. JavaScript 【正则表达式验证数字代码】

    可以看到 Ajax 请求多了个 x-requested-with ,可以利用它,request.getHeader("x-requested-with"); 为 null,则为传统 ...

  8. jquery中 append 和appendto的区别

    1. append(content)方法 方法作用:向每个匹配的元素内部追加内容. 参数介绍:content (<Content>): 要追加到目标中的内容. 用法示例: HTML代码为& ...

  9. vb的property 和event

    Event 语句 定义用户自定义的事件. 语法 [Public] Event procedurename [(arglist)] Event 语句包含下面部分: 部分 描述 Public 可选的.指定 ...

  10. 全屏显示网页FULLSCREEN API

    第一次看到应用 Fullscreen API 全屏显示网页,是 FaceBook 中的照片放大.作为一个比较新的 API,目前只有 Safari.Chrome 和 FireFox 三种浏览器支持该特性 ...