课堂练习--最大子数组和 环

一、设计思路

1、circle(int l)函数进行数组长度的输入。

2、setArray()函数进行数组的输入。

3、changeArray()函数将数组环转化为数组列 此时求出的max为环的最大值

首先,将array[]数组的值赋值给sArray[]数组,进行原值储存。然后for循环找出此数组的最小值。

然后在通过循环得到此最小值的位置。然后在将位置后的数赋值给新数组nArray数组前面,位置前的        赋值给nArray后面,得到一个最小值在首位置的新数组。

4、

ArrayMax()函数实现求最大子数组的和。应为复杂度为O(n),首先 输入一个数组 如:

-1 2 -1 -2 5 4 3 -6 8 9

先定义一个新的数组cArray[],长度为11.然后初始化cArray[1]为0;for循环中 有

cArray[i+1] = cArray[i]+array[i];

所以新的数组为 :

0 -1 2 1 -1...

因为求最大值,所以判断当cArray[]小于0时,将5 赋值给新数组

即为:

0 -1 2 1 -1 5 9 12 6...

最后在得到的新数组中求出最大的值 此时这个值为最大的子数组和。

源代码:

  1 import java.util.Scanner;
  2 public class Array2 {
  3
  4     public static void main(String[] args) {
  5         // TODO Auto-generated method stub
  6         System.out.println("Please input your array length");
  7         Scanner c = new Scanner(System.in);
  8         int cLength = c.nextInt();
  9         circle s = new circle(cLength);
 10         s.setArray();
 11         s.changeArray();
 12         s.arrayMax();
 13     }
 14
 15 }
 16 class circle
 17 {
 18     int array[];//原数组
 19     int sArray[];//储存原始数组
 20     int nArray[];//转换后的新数组
 21     int cArray[];//最后得到的数组
 22     int length;//数组长度
 23     int max;
 24     int min;
 25     int position;
 26     int i;
 27     int m;
 28     public circle(int l)//输入数组长度
 29     {
 30         length = l;
 31     }
 32
 33     void setArray()//输入数组
 34     {
 35         System.out.println("Please input your array  ");
 36         array = new int [length];
 37         Scanner s = new Scanner(System.in);
 38         for(int i=0;i<length;i++)
 39         {
 40             array[i]=s.nextInt();
 41         }
 42     }
 43
 44     void changeArray()//将数组环转换为数组列 此时求出的max为最大值
 45     {
 46         //储存原数组
 47         sArray = new int [length];
 48         for(i= 0;i<length;i++)
 49         {
 50             sArray[i] = array[i];
 51         }
 52
 53         //得到array数组中的最小值i
 54         for(i=length-2;i>=0;i--)
 55         {
 56             if(array[i]<array[i+1])
 57             {
 58                 min = array[i];
 59             }
 60             else if(array[i]>=array[i+1])
 61             {
 62                 m = array[i];
 63                 array[i] = array[i+1];
 64                 array[i+1] = m;
 65                 min = array[i];
 66             }
 67         }
 68
 69         //找到最小值位置
 70         for(i=0;i<length;i++)
 71         {
 72             if(sArray[i]==min)
 73             {
 74                 position = i;
 75             }
 76         }
 77
 78         //得到新的数组
 79         nArray = new int [length];
 80         for(i=0;i<length-position;i++)
 81         {
 82             nArray[i] = sArray[position+i];
 83         }
 84         for(i=length-position;i<length;i++)
 85         {
 86             if(length-position-i>0)
 87             {
 88                 nArray[i]=sArray[length-position-i];
 89             }
 90             else if(length-position-i<=0)
 91             {
 92                 nArray[i]=sArray[i+position-length];
 93             }
 94         }
 95
 96     }
 97     void arrayMax()//输出最大值
 98     {
 99         cArray = new int [length+1];
100         cArray[0] = 0;
101         for(i=0;i<length;i++)
102         {
103             if(cArray[i]>=0)
104             {
105                 cArray[i+1] = cArray[i]+nArray[i];
106             }
107             while(cArray[i+1]<0)
108             {
109                 cArray[i+2]=nArray[i+1];
110                 i++;
111             }
112         }
113         //在数组中得到最大值
114         for(i=1;i<length;i++)
115         {
116             if(cArray[i+1]>=cArray[i])
117             {
118                 max = cArray[i+1];
119             }
120             else if(cArray[i+1]<cArray[i])
121             {
122                 m = cArray[i];
123                 cArray[i]=cArray[i+1];
124                 cArray[i+1]=m;
125                 max = cArray[i+1];
126             }
127         }
128         System.out.println("max is "+max);
129     }
130 }

三、截图

四、总结

单元测试很重要,能够发现一些函数功能的bug。

时间: 2024-10-18 18:31:18

课堂练习--最大子数组和 环的相关文章

一维数组最大子数组(环)

题目要求:输入一个整型数组,数组里有正数也有负数 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和 设计思想 求出所有连续子数组的和,然后进行比较.带环的数组和直线数组的区别就在于,把数组两个数组依次相连,但是最后两个数组不进行输入. 例如:数组环为:1,2,3,4,5,6:剪成线之后就是:1,2,3,4,5,6,1,2,3,4.就满足所有的情况. 源代码: 结果截图:

课堂作业--最大子数组的和

设计思想: 对于有正数和负数都有的数组,随机从数组中选一个数,将选的数初始化为0,因此执行时从正数开始,依次累加,就可以了. 程序代码: public class java { public static void main(String args[]) {  int temp=0;         int sum=0;                       int[] arr={-1,2,4,-9,5};                for(int i=0;i<arr.length;i

课堂练习求环整数组中最大子数组之和

设计思路:之前还有一个课堂练习,是用户输入一个整数组,求其中最大子数组之和,我借鉴的其他同学的代码,仅在此基础上修改的.运用try,catch使得用户不必在输入数组之前输入数组的长度,但是需要一个除整数以外的数来结尾.一共使用了3个循环,运用一个循环得出每个数组中最大子数组之和的最大值,一个是用来计算最大子数组之和,最后一个用来实现数组的前移.第一个循环中包着另外两个循环.总的来说,是在之前课堂练习的基础上增加了将一个数组中的每个数做一次最前面的数,从中求出最大值. 程序代码: 1 import

一维回环数组求解最大子数组问题

一.题目与要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n) 二.设计思想 通过上次求解简单一维数组的最大子数组问题的解决,我们找到了一种实现时间复杂为O(n)的方法,采用的是二分法和递归

返回一个整数数组中最大子数组的和(环)

要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 结对开发:张子超 马思勉 刚看到这个题目首先想到的是将随机产生的数组复制一遍放在原数组后面,然后再进行求解,后来在和马思勉的探讨中得到新的解决思路,首先按照求解整数数组方法,

课堂作业:首尾相连求最大子数组

1.设计思想 先将数组环拆解补在原来数组后面,再依次找子数组并相加,更新最大值,并需要将开始的负数舍去从正数开始算起,单独讨论全负情况. 2.源程序 package zishuzu; import java.util.Scanner; public class zsz { public static void main(String[] args) { System.out.println("请输入数字个数:"); Scanner in=new Scanner(System.in);

课堂练习(返回一个环状一维整数数组中最大子数组的和)

设计思路: (1)将循环数组拆为我们熟悉的以为数组 (2)通过每个数组元素在数组中位置前移一位来实现环的拆分(array[i1]=array[i1+1]) (3)在每次拆分后的数组中求出最大子数组和并记录到一个新的数组result[]中 (4)求出result[]中的最大值r作为循环数组的最大值 拆分后数组最大子数组喝的解决: (1)定义整数数组arr[i] (2)定义maxsum为最大子数组和并赋初值为arr[0] (3)定义一个中间变量temp由arr[0]计算子数组(连续的)的和当temp

求最大子数组值(有环版)

设计思路:将环从合适的地方断开,再进行链式的寻找最大子数组值. 具体实现:将环分开:从下标为0的数开始查询,找出值为负值的第一个数,从这个数(不含此数)开始进行无环式求最大值的运算来找到第一个被“丢弃的”sum值(sum值为存储),从这个负值处将此环分开. 代码: 总结:总是忘记命名规范.

课堂练习----一个整数数组中最大子数组的和(2)

本次的题目是:返回一个整数数组中最大子数组的和 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 分析: 这个题目是在上个题目的基础的加上数组首位相连,并该数组最大子数组的和,实现方法就是把环变成直线的方法,通过for循环,在每次循环中,把数组中的元素作为数组的