Task 4.3 求环形数组的最大子数组和
任务要求:输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)
1.设计思想:(假设数组长度为n。)任务要求中提出了数组可以首尾相邻,这样在求数组最大子数组和的时候就要考虑两种情况:一是最大子数组和所在数组在A[0]...A[n]之间,不包括首尾相连的情况;二是最大数组和所在数组在A[i-1]...A[n-1],A[0]...A[j-1]之间就要考虑将A[n-1],A[0]连起来。
这时会有几种不同的思路来解决这个问题:(1)在求子数组和的时候让数组自动循环两遍,在第二次到A[n-1]时停止,可控制子数组长度小于n,这时用之前程序中的循环即可求出环形数组中的最大数组和;
(2)将数组自动地延长一倍,(将{a1,a2,a3....an}扩展成{a1,a2,a3...an,a1,a2,a3,...an}),求新的数组的最大数组和,同时也要将求得的子数组长度控制在n以下;
(3)两种方法的实现类似,但是在实现返回子数组的位置时因为数组的元素位置会有变化所以没有实现。于是改变了思路用对立的一种思路考虑问题:对问题之前提到的两种可能情况分别求最大子数组和,第一种就直接用一个循环可以求得和,勇士可以记录组数组的首尾位置;第二种情况可以先求出数组中的最小子数组和minsum,再用整个数组和减去它求出的就是最大子数组和,同时再记录下最小子数组和数组的首尾位置,换算一下就会得到最大子数组和的数组位置。
2.源代码:
//求数组中连续子数组的最大和(测试后)
//刘子晗 2015/4/12
#include <iostream>
#include <time.h>
using namespace std; void main()
{
int i, length, max, sum = ;
int head = ;
int tail = ;
int head1 = ;
int tail1 = ;
int arr[];
srand((unsigned)time(NULL));
cout << "请输入数组长度:";
cin >> length;
for (i = ; i < length; i++)
{
arr[i] = rand() % - ;
c7out << arr[i] << " ";
}//输出随机产生的数组
cout << endl;
int max1 = arr[];
int min = arr[]; for (i = ; i < length; i++)
{
if (sum <= )
{
sum = arr[i];
head = i;
}
else
{
sum = sum + arr[i];
}
if ( sum > max1)
{
max1 = sum;
tail = i;
}
}
cout << "最大子数组和不包括收尾相连的部分时,最大值为:" << max1 << endl; for (i = ; i < length; i++)
{
if (sum >= )
{
sum = arr[i];
head1 = i;
}
else
{
sum = sum + arr[i]; }
if (sum < min)
{
min = sum;
tail1 = i;
}
}
int sum1 = ;
for (i = ; i < length; i++)
{
sum1 = sum1 + arr[i];
}
int max2 = sum1 - min;
cout << "最大子数组和包括收尾相连的部分时,最大值为:" << max2 << endl;
cout << endl;
if (max1 >= max2)
{
cout << "综合两种情况可得最大子数组为:";
max = max1;
cout << "arr[" << head + << "] -- arr[" << tail + << "]" << endl;
for (int j = head; j <= tail; j++)
{
cout << arr[j] << " ";
}
}
else
{
max = max2;
cout << "综合两种情况可得最大子数组为:" ;
cout << "arr[" << tail1 + << "] -- arr[" << head1 << "]" << endl;
for (int j = tail1 + ; j < length ; j++)
{
cout << arr[j] << " ";
} for (int j = ; j < head1 ; j++)
{
cout << arr[j] << " ";
}
} cout << "子数组和的最大值为:" << max; }
3.截图:


4.总结:(1)当某一项工程要同时实现件功能时,要对过程采取相应的取舍,某个功能不能实现时,可以改变其他部分的实现方式以实现该功能;
(2)在实现过程中要树立一种从对立面上的角度看问题的思维即逆向思维,这个题目在求第二种的和时,通过求最小和间接得到最大和,就从中巧妙地减少了很大的运算量,是一种很好的方法。
Task 4.3 求环形数组的最大子数组和的更多相关文章
- 求一个数组的最大子数组(C/C++实现)
最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...
- 求解数组环中最大子数组和的问题(java)
//石家庄铁道大学 信1405-1 班 唐炳辉 在上一次作业中,对于普通数组的最大子数组的求解问题的基础上,将普通的数组变成一个首尾相接的环,求这个环的最大子数组.类似的,只要改变普通数组的数组位置, ...
- 软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)
题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为 ...
- 蚂蚁的难题(二)首尾相连数组的最大子数组和(DP)
蚂蚁的难题(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材 ...
- nyoj 983 ——首尾相连数组的最大子数组和——————【最大子串和变形】
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首 ...
- NYOJ 745 首尾相连数组的最大子数组和
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首 ...
- nyoj--983--首尾相连数组的最大子数组和(动态规划)
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是 ...
- nyoj983 首尾相连数组的最大子数组和
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是 ...
- 求二维数组的最大子数组———曹玉松&&蔡迎盈
继上节课老师让求了一维数组最大的子数组后,这节课堂上,老师加深了难度,给了一个二维数组,求最大子数组,开始觉得很容易,但是自己思考起来感觉这个算法很困难,既需要考虑数组直接的连续,又要求出最大的,老师 ...
随机推荐
- 升序排列的数组中是否存在A[i]=i
#include<stdio.h> void equal(int a[],int N) { int i; ;i<N;i++) { if(i<a[i]) { printf(&qu ...
- Java线程和多线程(十四)——Synchronized关键字解析
曾经有一个比较有趣的面试问题,那就是,关于使用synchronized关键字,是用在方法上面尾号,还是用在一个代码块上面为好? 答案就是使用锁定代码块为更好.因为这样不会锁定对象.当synchroni ...
- 矩阵类的python实现
科学计算离不开矩阵的运算.当然,python已经有非常好的现成的库:numpy. 我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此. 注:这个类的函数还没全部实现,慢慢在完善吧. ...
- 2、rbac组件 后台布局模板,权限按钮,菜单,可拔插,路径重定向
1.后台布局管理 https://www.cnblogs.com/venicid/p/7772742.html#_label0 1.通用模板 overflow: auto; //在a和b模板中进行切换 ...
- cogs791 [HAOI2012] 音量调节
大水题 这种题谁不能1A谁就吔屎/退役吧(说的就是我) 设dp[i][j]表示调完前i个音量为j有没有可能 没了 // It is made by XZZ // Fei Fan Ya Xi Lie~~ ...
- Python调用matplotlib实现交互式数据可视化图表案例
交互式的数据可视化图表是 New IT 新技术的一个应用方向,在过去,用户要在网页上查看数据,基本的实现方式就是在页面上显示一个表格出来,的而且确,用表格的方式来展示数据,显示的数据量会比较大,但是, ...
- iframe的简单使用方法
1.父页面调用子页面的元素(a代表iframe的id或者class,b代表子页面) $('a').contents().find("b") 2.子页面调用父页面的元素(c代表父页面 ...
- 开发人员常用的DOS命令
1.远程连接:mstsc /admin 2.开启服务:services.msc 3.打开注册表:regedit 4.IIS服务器重启:iisreset 5.打开记事本:notepad 6.查看系统信息 ...
- 怎么使用Spring配置事务 ?
Spring同时支持编程式事务策略和声明式事务策略,大部分时候都采用声明式事务策略. 声明式事务管理的配置方式,通常有以下4种: (1) 使用TransactionProxyFactoryBean为目 ...
- 在server 2003中搭建域服务(Http NTLM 代理)
在server 2003中搭建域服务(Http NTLM 代理) 在windows server 2003 X64中搭建域服务的操作. 可参考百度经验:http://www.cnblogs.com/z ...