Chinaunix首页 | 论坛 | 博客
  • 博客访问: 436878
  • 博文数量: 78
  • 博客积分: 2307
  • 博客等级: 上尉
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-04 00:31
个人简介

IT老鸟,信息安全硕士。

文章分类
文章存档

2017年(2)

2012年(21)

2011年(55)

分类: C/C++

2011-10-28 10:35:02

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

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
解题方法为mark allen weiss的数据结构与问题求解的内容。即线性扫描。如果当前sum值是正数则继续扫描。每次扫描的时候比较是否是最大值。如果当前sum值为0或者负数则从下一个数开始扫描。
这个是代码。
活动地址

  1. /*
  2.  * maxN.c
  3.  *
  4.  * Created on: 2011-10-26
  5.  * Author: blacksapper
  6.  */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. typedef struct maxN{
  10.     int startnum;
  11.     int endnum;
  12.     int sum;
  13. }maxN,*maxList;

  14. maxList max;
  15. maxList temp;
  16. int test[8]={1, -2, 3, 10, -4, 7, 2, -5};
  17. int Next(int *a,int len){
  18.     /**
  19.      * 初始化*/
  20.     int i=0;
  21.     //int sum=0;
  22.     if(!max)
  23.         return -1;
  24.     if(!temp)
  25.         return -1;
  26.     max->endnum=-1;
  27.     max->startnum=-1;
  28.     max->sum=-2147483647;
  29.     temp->endnum=1;
  30.     temp->startnum=1;
  31.     temp->sum=0;
  32.     //sum=a[0];
  33.     /*运算模块*/
  34.     for(;i<len;i ){
  35.         temp->sum =a[i];
  36.         if(temp->sum<=0){/*如果sum小于0则放弃当前过程走下一个过程*/
  37.             temp->startnum=i 1;
  38.             temp->endnum=i 1;
  39.             temp->sum=0;
  40.             continue;
  41.         }else{
  42.             if(temp->sum<max->sum)
  43.                 continue;
  44.             else
阅读(2245) | 评论(0) | 转发(0) |
0

上一篇:指针的使用

下一篇:C系列堆栈的区别

给主人留下些什么吧!~~