任务要求:输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

   如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。同时返回最大子数组的位置。

求所有子数组的和的最大值。要求时间复杂度为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 求环形数组的最大子数组和的更多相关文章

  1. 求一个数组的最大子数组(C/C++实现)

    最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...

  2. 求解数组环中最大子数组和的问题(java)

    //石家庄铁道大学 信1405-1 班 唐炳辉 在上一次作业中,对于普通数组的最大子数组的求解问题的基础上,将普通的数组变成一个首尾相接的环,求这个环的最大子数组.类似的,只要改变普通数组的数组位置, ...

  3. 软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)

    题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为 ...

  4. 蚂蚁的难题(二)首尾相连数组的最大子数组和(DP)

    蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材 ...

  5. nyoj 983 ——首尾相连数组的最大子数组和——————【最大子串和变形】

    首尾相连数组的最大子数组和 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首 ...

  6. NYOJ 745 首尾相连数组的最大子数组和

    首尾相连数组的最大子数组和 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首 ...

  7. nyoj--983--首尾相连数组的最大子数组和(动态规划)

    首尾相连数组的最大子数组和 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是 ...

  8. nyoj983 首尾相连数组的最大子数组和

    首尾相连数组的最大子数组和 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是 ...

  9. 求二维数组的最大子数组———曹玉松&&蔡迎盈

    继上节课老师让求了一维数组最大的子数组后,这节课堂上,老师加深了难度,给了一个二维数组,求最大子数组,开始觉得很容易,但是自己思考起来感觉这个算法很困难,既需要考虑数组直接的连续,又要求出最大的,老师 ...

随机推荐

  1. virtualbox虚拟机与物理机windows文件共享

    必须安装virtualbox的增强功能包(VBoxGuestAdditions) 1.打开Linux系统,选择 设备->安装增强增强功能 2.等待其自动安装,当出现press return to ...

  2. javaScript真值和假值以及相等操作符

    真值和假值 相等操作符(==和===) 下面分析一下不同类型的值用相等操作符(==)比较后的结果 toNumber 对不同 类型返回的结果如下: toPrimitive 对不同类型返回的结果如下: = ...

  3. vba 批量生成条形图代码

    Sub hong3()'' 宏3 宏d Dim a, b As Integer Dim str As String For a = 227 To 947 Step 15 b = a + 5 str = ...

  4. My97DatePicker:开始时间和结束时间的最大间隔为1个月30天,并且不大于当前时间(3种方法)

    问题的背景 在之前做Web项目的时候,开始时间和结束时间,只有2个要求: 1.开始时间必须小于等于结束时间,不能超过当前时间. 2.结束时间必须大于等于开始时间,不能超过当前时间. 由于开始时间不大于 ...

  5. jQuery学习-设置访问元素样式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. python基础学习1-第一个网络爬虫程序

    #!/usr/bin/env python # -*- coding:utf-8 -*- 煎蛋网抓妹子图 import urllib.request import os import random d ...

  7. 【转载】OCX和DLL的区别

    原文:http://blog.csdn.net/scucj/article/details/852181 一.关于DLL的介绍      DLL,动态链接库,Dynamic Link Library的 ...

  8. 33 -FTP文件传输

    1.需求 2.流程图 3.自己的版本 4.老师评语 5.修改后的代码 6.修改后版本

  9. Codeforces 909 C. Python Indentation (DP+树状数组优化)

    题目链接:Python Indentation 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现.现在有一种简化版的Python,只有两种语句: (1)'s'语句:Simple ...

  10. [Luogu4921]情侣?给我烧了![错位排列]

    题意 题意很清楚 \滑稽 分析 对于每一个询问 \(k\) ,记 \(g(x)\) 表示 \(x\) 对情侣都错开的方案总数,那么答案可以写成如下形式: \[ {ans}_k= \binom{n}{k ...