求最大子数组(循环数组)

一.设计思想:

  通过一个for循环。数组分别从0-最大,1-最大-0 等等依次 到最大-最大-1,通过这样的方式达到循环数组的目的。然后在每一个的数字里面,从第一个数开始向后按顺序相加,当相加结果为负数的时候,则此时不满足构成最大子数组的条件,然后从导致数组为负数的数的下一个数开始向后相加。最后求得此情况下的最大子数组和。然后分别求出N个最大子数组的和,然后在进行比较大小,得出最终的最大子数组的和。

二.出现的问题:

  起初并没有实现在一个首尾相接的数组中,最大子数组和为正确值,例如 1 -2 -3 6 5 正确结果为12 最后得出结果为11。

三.问题的解决

   通过大for循环里面嵌套小循环,来实现的数组的循环问题。然后在每个小循环里面求出最大的子数组和。最后再比较大小来求出最大子数组的和。

四.源代码:

package maxs;
import java.util.*;
public class maxs {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int num;
        System.out.println("请输入数组长度");
        num=sc.nextInt();
        int zif[]=new int[num];//分别的数组
        int neir[]=new int[num]; //数组里面的数
        int sum1[]=new int[num]; //最大值
        int d=sum1[0];
        System.out.println("请输入数组内容:");
        for(int i=0;i<num;i++)//输入num个数
        {
            neir[i]=sc.nextInt();
        }
         for(int j=0;j<num;j++)
        {
            for(int k=0;k<num;k++)   //分别从0-num 1-num-0 .....
            {
                zif[k]=neir[(j+k)%num];
            }
            int sum=zif[0];//记录数组和
            int b=0;//进行记录

            for(int i=0;i<num;i++)
            {
                if(b<0)
                {
                    b=zif[i]; //b<0,b为加为负数那位的后一位
                }
                else
                {
                    b+=zif[i];
                }
                if(sum<b)
                {
                    sum=b; //sum为当前最大子数组的和
                }
                sum1[j]=sum;
            }
            if(d<sum1[j])
            {
                d=sum1[j]; //得到最终的最大和
            }
        }
        System.out.print("最大子数组和为:");
        System.out.print(d);
    }
}

五.结果截图:

  

六.总结:

  一个首尾相接的循环数组,可以在不同的位置起始。一个循环的数组可以分为从不同的位置开始。然后从第一个数,到最后一个数,每个数都当一次开始然后依次下去到结束。这样的N个数组凑起来就是一个首尾相接的循环数组。子数组的最大和则可以让开始的数开始向后面相加,当遇到结果为负数的时候,就不在满足条件了。应该从加的最后一个数的下一个数再开始进行相加。

  我的收获的就是:起初自己并没有思路,不知道怎么来实现他。然后想想老师说的剪断,那么不就是分别在第一个数后, 第二个数后,,,依次来当作断点吗?将复杂问题,分解,让问题明白了许多。

时间: 2024-11-19 03:32:33

求最大子数组(循环数组)的相关文章

快学Scala 第三课 (定长数组,变长数组, 数组循环, 数组转换, 数组常用操作)

定长数组定义: val ar = new Array[Int](10) val arr = Array("aa", "bb") 定长数组赋值: arr(0) = "cc" 变长数组定义: val ab = new ArrayBuffer[String]() val ab1 = ArrayBuffer[String]() 定长数组增加元素: ab += "aa" ab += ("bb", "cc&q

循环数组求最大子数组

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 把数组每一位向后移动一位,最后一位放在第一位.循环多次,每次求其最大子数组,存放到新数组内,比较新数组中最大数,

循环一维数组求最大子数组

题目: 随机出一个一维数组,设该数组为循环数组,求其最大小子数组. 一.设计思路 求最大子数组,就求出最大的连续正子数组. 将数组分为全负和有非负值两种情况.全负求出最大值即可. 在有非负值的情况下,先判断该随机数组的首尾是否相连,即首尾是否都大于等于零.如果首尾相连,则将该一维数组分为首.中.尾三部分,先求出首尾和S1,再求中间最大连续正子数组和S,令S1和S与maxS相比较,求出最大子数组:如果首尾不相连,则直接借鉴前一种情况中部的算法,求最大正子数组S. 二.源代码 1 //刘双渤,刘洪阳

求一维循环数组最大子数组

设计思路: 一维循环数组:一维整数组头跟尾相连形成一个环. 问题解决方案:将一个一维数组扩大两倍,求新的数组的最大子数组即可. import java.io.IOException; public class xunhuanshuzu { public static void main(String[] args)throws IOException{ int []a= {23,-12,234,-234,123,2,0,1,-1,-34}; int n=a.length; int []b=new

二维数组循环求最大子数组

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.源代码 #include<iostream.h> int main() {  int x,y,n,m;  int s[10][20];  int sum[10][20]; cout<<"请输入3行4列的矩

求一维循环数组最大子数组的和

结对成员:信1201-1班 于海洋   袁佩佩 一.题目与要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 二.设计思路 利用之前的返回一个整数数组最大子数组的和程序的思路,不过这里将数放到一个链表里,首尾相连,来求最大子数组的和. 三.源

结对开发--四实现循环二维数组求最大子数组的和

一.实现思路 再上一个实验基础上加上环,我们实现环的思想是每一列依次向此替换,直至替换出能出现的所有的二维数组,再用上一个求最大子数组的方法全部实现 二.实验代码 package com.minirisoft; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Scanner; public class HuanTwoArray { public stat

二维数组循环求出最大子数组

package shengcheng; import java.util.Scanner; import org.junit.Test; public class ErweiXunhuan { @Test public void fun() { int [][]a=new int[4][8]; Scanner write=new Scanner(System.in); for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { a[i][j]=write.nex

一维数组头尾相连求最大子数组

题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1. 设计思想: 因为已经写过了一维数组的求最大子数组程序.所以只是在原程序上进行修改.首先产生随机数数组,然后进行计算,因为要求时间复杂度