转载请注明出处: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个整数单独一行,分别表示连续子向量的最大和、该子向量的第一个元素的下标和最后一个元素的下标。若是存在多个子向量,则输出起始元素下标最小的那个。

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

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

AC代码例如以下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4. bool flag;
  5.  
  6. int MaxSubSum(int *arr,int len,int *indexBegin,int *indexEnd)
  7. {
  8. if(arr==NULL || len<1)
  9. {
  10. flag = false;
  11. return -1;
  12. }
  13.  
  14. int i;
  15. int MaxSum;
  16. int CurSum;
  17. int CurBegin; //当前的CurSum的開始处的索引
  18. int CurEnd; //当前的CurSum的结束处的索引
  19. for(i=0;i<len;i++)
  20. {
  21. if(i == 0)
  22. {
  23. //先用第一个元素初始化
  24. *indexBegin = 0;
  25. *indexEnd = 0;
  26. CurBegin = 0;
  27. CurEnd = 0;
  28. MaxSum = arr[i];
  29. CurSum = arr[i];
  30. }
  31. else
  32. {
  33. //前面的和小于0,抛弃前面的和,从当前元素又一次開始计算
  34. if(CurSum < 0)
  35. {
  36. CurSum = arr[i];
  37. CurBegin = i;
  38. CurEnd = i;
  39. }
  40. else
  41. {
  42. CurSum += arr[i];
  43. CurEnd = i;
  44. }
  45. if(CurSum > MaxSum)
  46. {
  47. MaxSum = CurSum;
  48. //假设当前和大于前面出现的最大和,
  49. //则替换掉最大和的開始索引和结束索引
  50. *indexBegin = CurBegin;
  51. *indexEnd = CurEnd;
  52. }
  53. }
  54. }
  55. return MaxSum;
  56. }
  57.  
  58. int main()
  59. {
  60. int n;
  61. while(scanf("%d",&n)!=EOF && n!=0)
  62. {
  63. int *arr = (int *)malloc(sizeof(int)*n);
  64. if(arr == NULL)
  65. exit(EXIT_FAILURE);
  66.  
  67. int i;
  68. for(i=0;i<n;i++)
  69. scanf("%d",arr+i);
  70.  
  71. flag = true;
  72. int indexBegin,indexEnd;
  73. int result = MaxSubSum(arr,n,&indexBegin,&indexEnd);
  74. if(flag)
  75. {
  76. printf("%d ",result);
  77. printf("%d ",indexBegin);
  78. printf("%d\n",indexEnd);
  79. }
  80.  
  81. free(arr);
  82. arr = NULL;
  83. }
  84. return 0;
  85. }
/**************************************************************
    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. Java中Array.sort()的几种用法

    ****************************************************** * 精品书籍推荐:<Java从入门到经通> * 本书系统全面.浅显易懂,非常适 ...

  2. 04747_Java语言程序设计(一)_第1章_Java语言基础

    二进制0b开头 八进制0开头 十六进制0x开头 package com.jacky; public class Aserver { public static void main(String arg ...

  3. IBatis——(一)

    IBatis是持久层的框架,也就是我们说的Dao层框架,关注数据库操作以及和Java对象之间的关联,我们将这样的框架也称之为ORM(Object/Relaction Mapping)框架.而这里映射的 ...

  4. crm使用url打开窗口视图

    //URL可寻址元素使您能够包含指向Microsoft Dynamics CRM窗口. 视图. 对话框和其它应用程序中的报告. //这样.您就能够轻松扩展其它应用程序.报表或站点,以便用户无需切换应用 ...

  5. 在Linux系统上限制远程登录的IP

    在Linux系统上限制远程登录的IP,使用系统自带的配置文件. /etc/hosts.allow /etc/hosts.deny 匹配原则  先allow 后deny.

  6. asp.net中Repeart选中整行操作

    <asp:Repeater runat="server" ID="rpt_Student"> <HeaderTemplate> < ...

  7. 使用 Camtasia Recorder显示 “ camtasia an error occurred in the recorder: video codec open failed ”

    这是因为本机没有codec的缘故,可以下载一个:tscc解码器(TechSmith Screen Capture Codec) 2.0.3.0 安装版 http://www.cngr.cn/dir/2 ...

  8. asp.net实现伪静态遇到的问题

    之前在一次项目(asp.net网站)中要用到伪静态技术,实现的思路大致是这样的: 在全局配置文件Global.asax(普通的类可以通过实现IHttpModule来完成)中的Application_B ...

  9. XML新手入门 创建构造良好的XML(1)

    XML新手入门 创建构造良好的XML(1) 2009-03-19 09:24 Kay Whatley IBM Developerworks 我要评论(0) 字号:T | T 本文描述了构建良好的XML ...

  10. TIANKENG’s restaurant--hdu4883

    TIANKENG’s restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/O ...