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,数组中有正数也有负数,这个数组不是一般的数组,其首尾是 ...
- 求二维数组的最大子数组———曹玉松&&蔡迎盈
继上节课老师让求了一维数组最大的子数组后,这节课堂上,老师加深了难度,给了一个二维数组,求最大子数组,开始觉得很容易,但是自己思考起来感觉这个算法很困难,既需要考虑数组直接的连续,又要求出最大的,老师 ...
随机推荐
- POJ 1151 Atlantis 矩形面积求交/线段树扫描线
Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...
- MAC系统常用快捷键 基本常用的都整理在这里了
写在前面 Mac系统中有几个比较特殊的功能键,和Win系统的区别也主要在这里比如在Win系统中我们常用的Ctrl键,在Mac系统中对应的不是长得比较像的Cnotrol,而是Command键,貌似也是M ...
- React实战一
目录 1. 搭建环境 2. React知识点 1. 组件 1.1 定义一个组件 1.2 组合与拆分组件 1.3 组件传值 1.4 state 1.5 生命周期函数 1.6 无状态组件 1.7 List ...
- kettle安装部署及远程执行
一.windows环境 1.安装jdk 随意选择目录 只需把默认安装目录 \java 之前的目录修改即可 2.安装jre→更改→ \java 之前目录和安装 jdk 目录相同即可 注:若无安装目录要求 ...
- JavaWeb基础—项目名的写法
${pageContext.request.contextPath} //jsp中 request.getContextPath() //Servlet中 两者获取到的都是"/项目名称&qu ...
- # 2017-2018-1 20155224 加分项-实现mypwd
2017-2018-1 20155224 加分项-实现mypwd 1. 学习pwd命令 pwd命令以绝对路径的方式显示用户当前工作目录.命令将当前目录的全路径名称(从根目录)写入标准输出.全部目录使用 ...
- ruby各种循环输出数组元素
array = (1..10).to_a # 方法1 length = array.length length.times do |t| print "#{array[t]} " ...
- 二级管工作原理(PN结原理)学习
0.小叙闲言 前面已经写了两篇介绍放大器应用和MOSFET作驱动的文章:常规放大电路和差分放大电路和MOSFET使用与H桥驱动问题.但是对它们的工作原理并没有进一步研究一下,今天写下这篇文章,主要是介 ...
- 小白用linode VPS搭建wordpress博客过程备忘 | Linode中文教程
第一步:装debian系统 1.访问linode官方网站,查看http://library.linode.com/getting-started,我用的是debian系统,用putty登录,升级deb ...
- 15 [网络编程]-ssh远程命令
1.执行命令os.system('ls') os.system 返回1 or 0 ,不能当做数据发送 # windows # dir 查看某个文件夹下子自文件名与子文件夹名 # ipconfig 查 ...