环形数组的最大子数组之和

  上次课老师留了求一个数组的最大子数组之和,这次题目要求变化了一下,数组变成了环形的数组。主要的设计思想利用动态规划,非环形数组的任意一个元素只要判断前面的元素之和是否大于0就可以了,环形数组则还要判断数组元素后面的元素之和与0的关系。把数组复制一遍,用另外一个数组记录,从每个数组元素开头的子数组元素的个数不能超过数组的元素个数,否则就会多加某些元素。

package Arraysum_circle;
import java.math.*;
public class FindClass_circle
{
    public static void main(String[] args)
    {
        int[] arr = {9,2,-39,34,5,26,-8};
        for(int i = 0;i < arr.length;i++)
        {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        int result = Find_circle.findCircleArray(arr);
        System.out.println("最大子数组之和为:"+result);
    }
}

class Find_circle
{
    public static int findCircleArray(int[] array1)
    {
        //记录最大子数组的和
        int maxNum;
        //记录数组的长度
        int size = array1.length;
        int[] array2 = new int[2*array1.length];
        int[] array3 = new int[2*array1.length];
        //array2是两个相同的array1连接起来的
        for(int i = 0;i < array1.length;i++)
        {
            array2[i] = array1[i];
        }
        int len = array1.length;
        for(int i = len;i < 2*len;i++)
        {
            array2[i] = array1[i-len];
        }

        maxNum = array2[0];
        array3[0] = array2[0];
        //记录最大子数组的长度不能超过数组的长度 初始化为1
        int sonArrayLen = 1;
        for(int i = 0;(i < array2.length-1) && (sonArrayLen < size);i++)
        {
            if(array3[i] > 0)
            {
                array3[i+1] = array3[i] + array2[i+1];
                //连加一次最大子数组的长度就增加1
                sonArrayLen++;
            }
            else
            {
                array3[i+1] = array2[i+1];
                //从头加的话最大子数组的长度恢复为1
                sonArrayLen = 1;
            }
            maxNum = Math.max(maxNum,array3[i+1]);
        }
        return maxNum;
    }
}

时间: 2024-07-29 15:47:19

环形数组的最大子数组之和的相关文章

环形数组求最大子数组之和

环形数组求最大子数组之和: 实验要求: 随机产生一个整形数组,假设首尾相连为环形,求其相连的字数组的和,并输出子数组的元素. 设计思路: 因为是环形,所以要考虑自设的头尾的情况,在此分为两大类考虑,一种为数组中存在正数情况,一种为全部为负数的情况: 在存在正数的情况中又可分为三种情况,一种为全部为正数的情况,一种为自设的头元素为正数,最后一种为自设的头元素为负数.根据这几种情况分类进行实现. 在实现过程中,对数组元素从头到尾进行遍历,如果遇到正数即用和相加,直到相邻的下一个为负数,即存放目前该最

用c++实现环形数组的最大子数组之和

思路: 把一维环形数组从某一段切开,然后转化为之前做过的一维数组最大子数组的和的问题, 然后都其中切开的每一段一维数组做比较,输出最大的值. 1 #include<iostream> 2 #include<stdlib.h> 3 #include<time.h> 4 using namespace std; 5 int main() 6 { 7 int n; 8 cout<<"请输入一维环形数组的长度:"; 9 cin>>n;

结对开发——环形一维数组求最大子数组和

题目:返回一个整数数组中最大子数组的和.要求:(1)输入一个整形数组,数组里有正数也有负数.(2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.(3)如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大.(4)同时返回最大子数组的位置.(5)求所有子数组的和的最大值.要求时间复杂度为O(n).一.设计思想 这个问题的最优解一定是以下两种可能.可能一:最优解没有跨过array[n-1]到array[0],即和非环形数

二维数组求最大子数组和(环形)

一.实验题目 返回一个二维数组中最大子数组的和. 实验要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.实验思路 这次我们设计的实验是手动输入二维数组的行数和列数,二维数组的环形求和我们设计的思路和一位数组的类似,就是把求完的数组的第一列放到最后,依次类推.求最大的子数组和时和二维数组的求和类似,即:输入的二维数组是 -1 

《团队开发项目之三二维数组的最大子数组之和》

设计思想:按列或按行的次序依次进行计算每个以列或行的次序为基准的每种情况下的每个子矩阵的和,然后再依次进行比较每个子矩阵的和,取出最大的一个即是最大字数组之和: 源代码: //二维数组的最大子数组之和 //李敏,Apr 8th #include<iostream> #include<time.h> using namespace std; void main() { int m,n,a[100][100],k,t,c,i,j,z; int maxsum,sum[100],max=0

二维数组的最大子数组之和

一.设计思路:与求一维数组的最大子数组类似,将二维数组转化为一维数组来计算,也是通过遍历的方式将一个子矩阵与上几个子矩阵相加如果小于0则舍去这个子矩阵,按此方法计算从这个子矩阵以后的矩阵,求得遍历中最大值,即为最大子数组之和. 二.代码: package soft_third_test; public class test { static int maxSum(int p[][],int startLine,int endLine,int n){ int ans=p[endLine][1]-p

输出一维环形数组中最大子数组和最大子数组的位置

组员 石鹤李海超 一.题目 输出一维环形数组中最大子数组的和 和最大子数组的位置 二.设计思想 把原数组扩大一倍,再把原数组放到后边,只需改变上次试验是循环变量即可求出最大子数组的和. 三.源代码 #include<iostream.h> #include<time.h> #include<stdlib.h> int main() { int arry[20]; int start,end,i; long sum,max; cout<<"Pleas

二维环形数组求最大子数组和

一.要求 1.题目: 返回一个二维数组中最大子数组的和. 2.要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 3.结对开发要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 二.设计思路 1.从键

环形数组的最大子数组求解

然后再用一维数组求解最大子数组的方法即可.值得注意的是,子数组的长度不可超过n,在我程序中有所体现.最终,因为没有要求时间复杂度的问题,我选择 了遍历的方法求解了此问题. 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int n; 6 cout<<"输入环形数组的长度:"; 7 cin>>n; 8 int *p; 9 p=new int[n]; 10 for(int i=