环状一维数组

结对伙伴:郭婷 朱慧敏

1.题目:返回一个整数数组中最大子数组的和。

要求:

输入一个整形数组,数组里有正数也有负数。

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

如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。

同时返回最大子数组的位置。

求所有子数组的和的最大值。要求时间复杂度为O(n)。

2.设计思路

开始我们是想在原来程序的基础上将数组进行扩展,对于一个n的一维数组,如果成环可以将数组长度扩展为2*n-1的。

3.源代码

#include<iostream>
#include<cmath>
using namespace std;
#define N 1000
#define max(a,b)(a>b?a:b)

int MaxSum_base(int arr[], int n)
{
    int i, sum = 0;
    int max = arr[0];
    for (i = 0; i<n; i++)
    {
        if (sum <= 0)
        {
            sum = arr[i];
        }
        else
        {
            sum = sum + arr[i];
        }
        if (sum>max)
        {
            max = sum;
        }
    }
    return max;

}

int MaxSum_linked(int arr[], int n)
{
    int c = arr[0];
    int ans = c;
    bool h = false;
    for (int i = 1; i < n * 2 - 1; i++)
    {
        if (i < n&&arr[i] < 0)
            h = true;
        c = max(c + arr[i%n], arr[i%n]);
        ans = max(ans, c);
        if (i == n - 1 && !h)
            return ans;
    }
    return ans;
}

void MaxSum_location(int * arr, int n, int & start,int &end)
{
    int maxSum = -N;
    int sum = 0;
    int cstart = start = 0;  //cstart记录每次当前起始位置
    for (int i = 0; i < n; ++i)
    {
        if (sum < 0)
        {
            sum = arr[i];
            cstart = i;     // 记录当前的起始位置
        }
        else
        {
            sum += arr[i];
        }
        if (sum > maxSum)
        {
            maxSum = sum;
            start = cstart; // 记录并更新最大子数组起始位置
            end = i;
        }
    }
}

int main()
{
    int i=0, n, a[100],s,e;
    cout << "输入数组个数:";
    cin >> n;
    cout << "请输入数组:";
    for (i = 0; i < n; i++)
    {
       cin >> a[i];
    }
    int x = MaxSum_base(a, n);
    cout << ">>线性最大子数组的和为:" << x << endl;
    int sum = MaxSum_linked(a, n);
    cout << ">>环形最大子数组的和为:" <<sum<< endl;
    MaxSum_location(a,n,s,e);
    cout << "最大子数组的位置是:" <<"第"<< s+1<<"个到第"<< e << "个" <<endl;

}

4.程序截图

5.总结

在程序实现后,我们以为完成了,可是后来发现有些结果不对。有些数组成环后子数组的长度会超过数组本身的长度,这就不对了,于是我们有进一步修改了程序。这次的程序我们发现原来程序本身也会隐藏一些错误,需要我们对每一种情况进行分析,解决。

时间: 2024-07-29 09:57:54

环状一维数组的相关文章

JAVA一维数组

import java.applet.Applet; import java.awt.*; //用*表示包含awt这个源包下的所有方法成员,awt为图形界面设计包 public class Applet_Example extends Applet{ int a[]; //定义一个一维数组 public void init(){ a=new int[5]; //定义一个一维数组,该数组包含5个元素 a[0]=100; //分别对数组元素赋值 a[1]=101; a[2]=102; a[3]=10

一维数组的三种写法

/** *一维 数组的几种写法 * 记住:①数组的左边不能有数字 *   ②数组的右边既然初始化了数组,那么就要赋值 */ //一维数组的标准格式 String[] arr1 = new String[]{"bo","li","jian"}; //上面的简写格式 String[] arr2 = {"bo","li","jian"}; //初始化容量 String[] arr3 = new

输出 一维数组中最大的数+数组遍历

1 //将数组中最大的数输出 2 //数组遍历 3 int[] arr = new int[]{2,4,1,6,10,11}; 4 System.out.println("输出一维数组 :"); 5 for(int i=0; i<arr.length;i++) 6 { 7 System.out.print(arr[i]+" "); 8 } 9 10 System.out.println(); 11 12 int max = arr[0]; 13 for(int

算法练习:一维数组旋转

题目描述:求一个一维数组向右旋转K个位置后的结果.比如,一维数组{1, 2, 3, 4, 5},当k = 2时,求得的结果为{4, 5, 1, 2, 3}.要求常数级空间复杂度,允许修改原有数组. 一.使用额外的空间(在不要求常数级空间复杂度的情况下) 这样很简单,使用一个额外的空间,保存原有数组的元素,然后可以错位复制原有数组 元素,即可达到题目的要求.比如数组{1, 2, 3, 4, 5},当k = 2时,先将4,5复制到结果数组,然后将1,2,3复制到结果数组的后面部分. //使用额外空间

07-JAVA一维数组及多维数组(2)

1. Java数组的定义: 1) 和其它编程语言的数组定义基本相同,具有2要素,分别是类型一致(数组中的数据都是一种类型的)和定长(初始化时就已经确定长度,这也意味着数组的内存空间也确定了,即大小不变了): 2) 在Java中数组类型也是一种引用类型,底层是用面向对象的类实现的: 3) 定义数组:支持两种格式 i. Java格式:type[] arrayName; ii. 传统的C语言格式:type arrayName[];  // 为了满足C程序员的编程习惯 !!更加推荐Java风格的,因为其

07-JAVA一维数组

一维数组的声明 使用一个数据时,必须要对其进行声明,这个道理对于数组来说也一样,数组在使用之前也必须先声明.先看下面的代码,是如何声明一个变量的. int a; 仔细分析一下:int 是指变量的数据类型,a 是指变量名,由变量的声明可以联系到数组的声明. int a[]; 仔细分析一下:int 是指数组中所有数据的数据类型,也可以说是这个数组的数据类型,a[]表示数组名. 基本类型数组的声明有几种形式: int a[]; int[] a; 这两种形式没有区别,使用效果完全一样,读者可根据自己的编

php多维数组化一维数组

一.使用foreach <?php function arr_foreach ($arr) { static $tmp=array(); if (!is_array ($arr)) { return false; } foreach ($arr as $val ) { if (is_array ($val)) { arr_foreach ($val); } else { $tmp[]=$val; } } return $tmp; } $a = array(1,2=>array(3,4=>

C# 一维数组(1)

一.复习: 1.break与continue.这两个关键字一般放在循环的花括号里面使用.break——结束整个循环.continue——结束本次循环,进入下次循环. break的案例:int i = 1;for(;;){if(i>100){break;}Console.Write(i+"\t");i++;} continue的案例:for (int i = 1; i <= 100; i++){if(i%2 == 0){continue;}Console.Write(i +

C#一维数组(2)

数组是一种常用的数据类型,且属于引用类型.它是由一组相同数据类型的元素构成的.在C#语言的类型系统中,数组由抽象类System.Array派生而来的.在内存中,数组占用一块连续的内存,元素按顺序连续存放在一起,数组中每一个单独的元素并没有自己的名字,但是可以通过其位置(索引)来进行访问或修改. 在C#中,数组元素的索引是从0开始的,即对于有N个元素的数组,其索引范围是从0~N-1. 在这里重点讨论一下一位数组的使用方法. 1.一维数组的声明 数组声明时,主要声明数组的名称和所包含的元素类型,一般