免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: whpu000625
打印 上一主题 下一主题

求一个数组中最大的相邻元素之和 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-12-29 11:51 |只看该作者

求一个数组中最大的相邻元素之和

我的想法是这样:
1如果全是负数,那么返回值就是最大的那个负数,存到sum
2当遇到正数时,就考虑求和sum1。一直求到最后一个正数,
3但是当后面第二个正数大于后面第一个非正数的绝对值,就把这两个数加到sum1,然后走到第2步。否则,4
4sum1和sum比较,看是否要更改。

代码实现如下

  1. #include<iostream>;
  2. using namespace std;

  3. void MaxSum(int* ip,int size)
  4. {
  5.         int sum=ip[0],sum1=sum,start=0,end=0,start1,end1;
  6.         int i=0;

  7.         while(ip[i]<0&&i<size)
  8.         {
  9.                 if(ip[i]>;sum)
  10.                 {
  11.                         sum=ip[i];
  12.                         start=end=i;
  13.                 }
  14.         }

  15.         while(i<size)
  16.         {
  17.                 if(ip[i]>;0)
  18.                 {
  19.                         start1=end1=i;
  20.                         sum1=0;
  21.                         while((end1<size)&&(ip[end1]>;0))
  22.                         {
  23.                                 sum1+=ip[end1];
  24.                                 end1++;
  25.                                 i=end1+1;
  26.                                 if((ip[end1]<=0)&&(end1<size-1)&&(ip[end1+1]>;-ip[end1]))
  27.                                 {
  28.                                         sum1+=ip[end1]+ip[end1+1];
  29.                                         end1+=2;
  30.                                 }
  31.                         }
  32.                        
  33.                         if(sum1>;sum)
  34.                         {
  35.                                 start=start1;
  36.                                 end=end1-1;
  37.                                 sum=sum1;
  38.                         }
  39.                 }
  40.                 else
  41.                 {
  42.                         i++;
  43.                 }
  44.         }

  45.         cout<<"Start: "<<start<<endl
  46.                 <<"End: "<<end<<endl;
  47.         for(i=start;i<end;i++)
  48.                 cout<<ip[i]<<" ";
  49.         cout<<endl
  50.                 <<"The sum is "<<sum<<endl;
  51. }

  52. int main()
  53. {
  54.         int a[]={2,3,-6,3,4,3,-2,5,2,-3};
  55.         MaxSum(a,10);
  56.         return 0;
  57. }
复制代码

论坛徽章:
0
12 [报告]
发表于 2004-12-29 11:52 |只看该作者

求一个数组中最大的相邻元素之和

论坛徽章:
0
13 [报告]
发表于 2004-12-29 11:54 |只看该作者

求一个数组中最大的相邻元素之和

虽然上面的代码看上去循环有嵌套,不过还是O(n)的算法,内循环改变的也是外循环的i
另外i和end1两个变量其实可以合并,不过为了容易阅读一点,还是多用了一个变量

论坛徽章:
0
14 [报告]
发表于 2004-12-29 12:13 |只看该作者

求一个数组中最大的相邻元素之和

[quote]原帖由 "guile"][/quote 发表:

不行,发现自己第三步考虑太简单了,等我改改

论坛徽章:
0
15 [报告]
发表于 2004-12-29 12:50 |只看该作者

求一个数组中最大的相邻元素之和


  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. void MaxSum(int *m, int n)
  4. {
  5.     int i, start=0, end=0, max, sum, istart=0, iend=0, sum2=0, start2=0;
  6.         max=m[0];
  7.         for(i=0;i<n && m[i]<=0;i++)//我觉得把负数单独拿出来考虑更好一点
  8.         {
  9.                 if(m[i]>;max)
  10.                 {
  11.                         max=m[i];
  12.                         start=i;
  13.                 }
  14.         }
  15.         if(i==n)
  16.         {
  17.                 printf("start %d, end %d, sum %d\n", start, start, max);
  18.                 return;
  19.         }
  20.         start2=start=istart=i;
  21.         for(i=n-1;i >;-1 && m[i]<=0;i--);//末尾的非正数也拿掉,少做几次加法
  22.         iend=i;
  23.         max=m[start];
  24.         sum=0;
  25.         for(i=istart;i<=iend;i++)
  26.         {
  27.                 sum+=m[i];
  28.                 sum2+=m[i];
  29.                 if(sum>;max)
  30.                 {
  31.                         end=i;
  32.                         max=sum;
  33.                 }
  34.                 if(sum2<=0 && m[i]>;0)//这里用的算法和yuxh的一样.真佩服yuxh,算法这方面做得太好了
  35.                 {
  36.                         sum2=m[i];
  37.                         start2=i;
  38.                 }
  39.                 if(sum2>;max)
  40.                 {
  41.                         start=start2;
  42.                         end=i;
  43.                         max=sum2;
  44.                 }
  45.         }
  46.     printf("start %d, end %d, sum %d\n", start, end, max);
  47. }
  48. int main()
  49. {
  50.     int m[10] = {-2,-3,-6,-3,-4,-3,-2,-1,-2,-3};

  51.     MaxSum(m, 10);
  52.         return 0;
  53. }
复制代码

论坛徽章:
0
16 [报告]
发表于 2004-12-29 12:52 |只看该作者

求一个数组中最大的相邻元素之和

算法如下
1用sum,start,end储存最大和,开始下标,结束下标。
如果数组里开始遇到的都是负数,那么sum保存的就是最大的负数

2当遇到正数的时候,开始用sum1求和,start1代表开始下标,end1要用来探测所以存储的是结束下标的下一个
求和一直求到遇到非正数或者结束
如果不是正数,探测下一个下标作为开始

3把后面的非正数和sum1加到sum2,再加下一个正数。
如果sum2>;=sum1,则用sum2替换sum1,回到2
否则4
4比较sum和sum1,sum1大的话替换掉sum,以后的探测下标从end1-1开始
  1. #include<iostream>;
  2. using namespace std;

  3. void MaxSum(int* ip,int size)
  4. {
  5.         int sum=ip[0],sum1,sum2,start=0,end=0,start1,end1;
  6.         int i=0;

  7.         while(i<size&&ip[i]<0)
  8.         {
  9.                 if(ip[i]>;sum)
  10.                 {
  11.                         sum=ip[i];
  12.                         start=end=i;
  13.                 }
  14.                 i++;
  15.         }

  16.         while(i<size)
  17.         {
  18.                 if(ip[i]>;0)
  19.                 {
  20.                         start1=end1=i;
  21.                         sum1=0;
  22.                         while((end1<size)&&(ip[end1]>;=0))
  23.                         {
  24.                                 sum1+=ip[end1];
  25.                                 end1++;
  26.                                 i=end1;
  27.                                 if((i<size)&&(ip[i]<=0))
  28.                                 {
  29.                                         sum2=sum1;
  30.                                         while((i<size)&&(ip[i]<=0))
  31.                                         {
  32.                                                 sum2+=ip[i];
  33.                                                 i++;
  34.                                         }
  35.                                         if(i<size)
  36.                                         {
  37.                                                 sum2+=ip[i];
  38.                                                 if(sum1<=sum2)
  39.                                                 {
  40.                                                         end1=i+1;
  41.                                                         sum1=sum2;
  42.                                                 }
  43.                                         }
  44.                                 }
  45.                         }
  46.                         if(sum1>;sum)
  47.                         {
  48.                                 start=start1;
  49.                                 end=end1-1;
  50.                                 sum=sum1;
  51.                         }
  52.                        
  53.                
  54.                 }
  55.                 else
  56.                 {
  57.                         i++;
  58.                 }
  59.         }

  60.         cout<<"Start: "<<start<<endl
  61.                 <<"End: "<<end<<endl;
  62.         for(i=start;i<=end;i++)
  63.                 cout<<ip[i]<<" ";
  64.         cout<<endl
  65.                 <<"The sum is "<<sum<<endl;
  66. }

  67. int main()
  68. {
  69.         int a[]={-2,-3,-6,3,4,-1,-2,5,2,-3};
  70.         MaxSum(a,10);
  71.         return 0;
  72. }
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
17 [报告]
发表于 2004-12-29 13:01 |只看该作者

求一个数组中最大的相邻元素之和

assiss的程序还有问题呀!
int m[10] = {2,3,-6,3,4,3,-2,5,2,-3};

start 0, end 8, sum 14

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
18 [报告]
发表于 2004-12-29 13:15 |只看该作者

求一个数组中最大的相邻元素之和

guile的算法也有问题
int a[]={2,3,-4,3,4,3,-2,5,2,-3};

start:3, end:8, sum:15

论坛徽章:
0
19 [报告]
发表于 2004-12-29 13:15 |只看该作者

求一个数组中最大的相邻元素之和

原帖由 "yuxh" 发表:
,3,-6,3,4,3,-2,5,2,-3};

start 0, end 8, sum 14

sorry,还没完全领会精神就乱发程序了.       
再来,反正脸皮厚

  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. void MaxSum(int *m, int n)
  4. {
  5.     int i, start=0, end=0, max, sum, istart=0, iend=0, sum2=0, start2=0;
  6.         max=m[0];
  7.         for(i=0;i<n && m[i]<=0;i++)
  8.         {
  9.                 if(m[i]>;max)
  10.                 {
  11.                         max=m[i];
  12.                         start=i;
  13.                 }
  14.         }
  15.         if(i==n)
  16.         {
  17.                 printf("start %d, end %d, sum %d\n", start, start, max);
  18.                 return;
  19.         }
  20.         end=start2=start=istart=i;//加了个END.因为发现如果只有一个正数时END有误.
  21.         for(i=n-1;i >;-1 && m[i]<=0;i--);
  22.         iend=i;
  23.         sum2=sum=max=m[start];
  24.         for(i=istart+1;i<=iend;i++)
  25.         {
  26.                 sum+=m[i];
  27.                 sum2+=m[i];
  28.                 if(sum>;max)
  29.                 {
  30.                         end=i;
  31.                         max=sum;
  32.                 }
  33.                 if(m[i-1]<=0 && m[i]>;0)
  34.                 {
  35.                         sum2=m[i];
  36.                         start2=i;
  37.                 }
  38.                 if(sum2>;max)
  39.                 {
  40.                         start=start2;
  41.                         end=i;
  42.                         sum=max=sum2;//这里又修改了.唉.惭愧.
  43.                 }
  44.         }
  45.     printf("start %d, end %d, sum %d\n", start, end, max);
  46. }
  47. int main()
  48. {
  49.     int m[10] = {2, 3, -6, 3, 4, 3, -2, 5, 2, -3};

  50.     MaxSum(m, 10);
  51.         return 0;
  52. }
复制代码

论坛徽章:
0
20 [报告]
发表于 2004-12-29 13:25 |只看该作者

求一个数组中最大的相邻元素之和

原帖由 "yuxh" 发表:
4,3,4,3,-2,5,2,-3};

start:3, end:8, sum:15

恩,考虑中
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP