- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
求数组的最大子数组
求数组的最大子数组
本文将提到解决此类问题的两种方法,第一种是暴力求解法,第二种则运用分治法进行求解。
针对此问题,(个人认为)返回值中必须涉及所得数组的左右边界以及最终所得的最大数组的值,三者中无论缺少哪一个都显得实用性不足。
而在c语言中,函数返回值只能有一个,要想返回值有多个必须用别的特殊方法,可参见这篇博文/supreme42/article/details/7636475(引用),本文将用结构体解决这一问题
***********************************************************************************************
***********************************************************************************************
第一种方法,暴力求解法,此法的时间复杂度是O(n2)
具体可实现代码如下:
//暴力求解最大数组问题
//wsrelea_2015_9_5
#include
#include ?//此头文件声明的存在使得后面可以调用到INT_MIN(负的无穷大)
#define N 8
struct shuzu
{
int low;
int high;
int sum;
};
struct shuzu maxSubArray(int *A,int n)
{
struct shuzu ss={0,0,0};
? ? int maxium = INT_MIN; //保存最大子数组之和
? ? for (int i=0;i
? ? {
? ? int sum = 0; //sum记录第i到j的元素之和
? ? ? ? for (int j=i;j
? ? ? ? {?
? ? ? ? ? ? sum += A[j];
? ? ? ? ? ? if (summaxium) ?//更新最大值?
? ? ? ? ? ? {
? ? ? ? ? ? maxium = sum;
? ? ? ? ? ? ss.low=i;
? ? ? ? ? ? ss.high=j;
? ? ? ? ? ? ss.sum=maxium;
? ? ? ? ? ? } ? ? ? ? ? ? ??
? ? ? ? ?}?
? ? } ? ? ??
? ? return (ss);
}
int main ()
{
struct shuzu fh={0,0,0};
int A[N]={1,2,3,4,-3,-5,7,-2};
(fh)=maxSubArray(A,N-1);
printf (%d %d %d,fh.low,fh.high,fh.sum);
return 0;
}
代码截图如下:
第二种方法为分治法求解,此法的时间复杂度是O(nlogn)
具体可实现代码如下:
//分治法求解最大数组问题
//wsrelea_2015_8_28
//return不能返回多个值,未解决,当前程序中只会返回最后一位的值
//2015_9_5解决返回多个值得问题,(利用结构体进行解决)?
#include
#include
#define N 8
struct shuzu
{
int low;
int high;
int sum;
};
//FIND_MAX_CROSSING_SUBARRAY(跨越中点的最大数组求解)
struct shuzu FIND_MAX_CROSSING_SUBARRAY(int *A,int low,int mid,int high)
{?
? ? struct shuzu aa;
int left_sum=INT_MIN; ?//INT_MIN表示负的无穷大,使用时要加上#include头文件
int sum=0;
? ? int left_max,right_max; ?
for (int i=mid;i=low;i--)
{
sum=sum+A[i];
if (sumleft_sum)
{
left_sum=sum;
left_max=i;
}
}
int right_sum=INT_MIN;
sum=0;
for (int i=mid+1;i=high;i++)
{
sum=sum+A[i];
if (sumright_sum)
{
right_sum=sum;
right_max=i;
}
}
aa.low=left_max;
aa.high=right_max;
aa.sum=left_sum+right_sum;
return (aa);
}
//分治法求解最大子数组
struct shuzu FIND_MAX
您可能关注的文档
最近下载
- 用于加工玻璃的双边磨边机.pdf VIP
- HIV相关知识培训课件.ppt
- 装配式农村住房建筑构造(二)(叠合钢网内置保温现浇混凝土墙体).pdf VIP
- 装配式农村住房建筑构造(三)(螺栓连接装配式夹芯保温混凝土墙体).pdf VIP
- J23J283 装配式农村住房建筑构造 (四) 混凝土自保温模块墙体 DBJT02-236-2023.pdf VIP
- J23J280 装配式农村住房建筑构造 (一) 桁架连接装配式模块墙体 DBJT02-233-2023.pdf VIP
- 一种双边磨边机.pdf VIP
- 癫痫诊疗指南(2025).docx
- 装配式农村住房建筑构造(五)(低层现浇混凝土聚苯模块墙体).docx VIP
- GB/T 25097-2010_绝缘体带电清洗剂.pdf
文档评论(0)