子数组最大值02

合作过程:

    由于上次作业设计思想不同,经过讨论采用了统一的设计思想。对于这次的作业我们一起进行讨论,我们统一利用二维数组完成一维数组的循环求子数组。我负责进行编码,丽萍负责进行代码的审查和代码的测试。

设计思想:

基于上次不循环一维数组求子数组的最大值。

1.将一维数组转化为二维数组,变相将其转化为循环。即二维数组每一行使一维数组依次向前移动一个数。

2.利用上次思想一次求出每行子数组的最大值。

2.1.定义两个数s,max用来更新子数组的最大值,从数组data[]的data[n-1]开始进行求和比较。

2.2利用for循环,依次判断前几项之和是否小于0,若小于0则从该项继续寻找最大值,并与前几项的最大值进行比较。选出最大值。

3.比较二维数组每行子数组的最大值的大小,并作比较,将最大值输出。

遇到的问题:

一维数组转化为二维数组出现数组越界。

源代码:

import java.util.Scanner;
public class Test{
      static int[][] transform(int data[],int n)
      {//将以为数组转化为二维数组,用来将一维数组变为循环数组
          int d[][]=new int[n][n];
          int j;
          for(j=0;j<n;j++)//第一行保存一维数组
          {
              d[0][j]=data[j];
          }
          for(int i=1;i<n;i++)//一次前进一个数储存在二维数组下一行
          {
              for(j=0;j<n-1;j++)
              {
                  int t=d[i-1][0];
                  d[i][j]=d[i-1][j+1];
                  d[i][n-1]=t;
              }
          }
          return d;
      }
      static int sum(int data[], int n)//定义数组和数组长度
      {
          int s = data[n-1];//s用来更新子数组最大值
          int max = data[n-1];//a表示最大值
          for(int i=n-2;i>=0;i--)//逆序进行
          {
              if(s<0)//前几项的和为负数,重新计算
              {
                  s=0;
              }
              s=s+data[i];
              if(s>max)
              {
                  max=s;//将最大值赋值给a
              }
          }
          return max;
      }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in=new Scanner(System.in);
        System.out.println("请输入数组长度:");
        int n=in.nextInt();
        int array[]=new int[n];
        int twoArray[][]=new int[n][n];
        System.out.println("请输入"+n+"个整数:");
        for(int i=0;i<n;i++)
        {
            array[i]=in.nextInt();
        }
        //转化为二位数组
        twoArray=transform(array,n);

        int result[]=new int[n];
        int chucun[]=new int[n];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                //将二维数组每一行储存在一维数组中
                chucun[j]=twoArray[i][j];
            }
            //计算每行的子数组最大值
            result[i]=sum(chucun,n);
        }
        //找到result中的最大值
        int max=result[0];
        for(int i=0;i<n-1;i++)
        {
            if(result[i+1]>result[i])
            {
                max=result[i+1];
            }
        }
        System.out.print("子数组的最大值为:"+max);
    }

}

实验结果截图:

总结:

在第一次程序的基础上,只要实现一位数组循环即可。可用二维数组实现一维数组循环。

时间: 2024-10-26 08:29:13

子数组最大值02的相关文章

联通子数组最大值设计03

So郁闷,我先把老师提出的问题写出来; 返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.下面是给的示例图: 最近已经完全的陷入了编程的怪圈,自己完全没找到自己的方向吧,废话不多说,直接上问题:在子数组问题上我觉得基本都是一位子数组的变形,应该不会有特别的变化,最多是难度上去,但是基本的思想不会变,今天我发现错了,可能是我错了. 我的想法:在网上看代码找到的灵感:因为觉得老师上课讲的图的方法有些麻烦所以就想还是用一维数组的

二位数组的子数组最大值

该题是poj的1050号题:http://poj.org/problem?id=1050 同时在<编程之美> 2.15 小节 思想是: 1.把二维降到一维,把 同一列的若干个数的和算出来, 然后从行的角度,变成求一维数组的子数组和的最大值, 一共要计算 (1+n)*n/2 次一维数组的和最大值 2.在求同一列的若干数的和的时候,用辅助数组加快计算: 把第l列中, 第1~k行数的和提前计算好,放到辅助数组 b[k][l]中, 然后求 第l列的 第i行和第j行之间的数的和,就等于 b[i][l]-

求子数组最大值

设计思路:用户输入一个数组本次规定为4个数的数组,可根据需要进行修改,关于如何求出子数组中和的最大值:应该先明确最大值的来源数组一定包括原来数组中的最大值,因此找到这个最大值并记录下标,定义两个和的变量temp和temp1,从最大值下标开始逐一求和比较最终得到子数组最大的和. 源代码: package arrsum; import java.util.Scanner; public class Sum { public static void main(String[] args) { int

首尾相连的循环数组求其子数组最大值

结对成员 曹坤  翟凯 题目 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 思路 经过讨论,只需将数组扩展为2倍长度,array[i]=array[length+i];从第一个元素开始依 次五个元素为一组,共分为五组进行:分别求得五个最大子数组和

子数组最大值求和

一.设计思路: 通过输入数组的长度和数组中数的取值范围,产生一个随机数组,并用随机数决定正负号.然后在一次循环中,将数组中的数依次相加,若相加大于0则继续相加,若相加小于0则舍弃之前的数,重新开始相加,并且在循环中记录相加产生的最大的数,即为最大子数组的和. 二.代码 #include<iostream> using namespace std; void main() { int i,x,y,z; int s,sum,head,end,h,e; cout<<"请输入数组

LeetCode OJ:Maximum Subarray(子数组最大值)

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum = 6. 典型的DP问题,递推条件还是想了有点长时间,代码如下所示: 1

编程之美 2.14求数组的子数组之和的最大值

对于一个有N个元素的数组,a[0]~a[n-1],求子数组最大值. 如:数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6. 方法一:暴力 循环遍历,输出所有,判断最大的和 1 #include"iostream" 2 #define MAX 1001 3 using namespace std; 4 5 int main(){ 6 int n, a[MAX], sum , maxsum ; 7 8 cin &

软件工程概论-课后作业3(子数组求最大值)

[设计思路] 1.用户初始化一个数组 2.定义tempmax作为临时最大值,定义最大值max,初始均为array[0] 3.使用循环从array[1]开始,判断tempmax值为正或负,若为正tempmax为正,tempmax值变为tempmax加上遍历的数,若tempmax值为负,tempmax值变为遍历的那个数. 4.比较max和tempmax值大小,若max小将tempmax值赋给max [程序源代码] import java.util.*; public class MaxsArray

求数组的子数组之和的最大值及扩展问题2

这是一道来自<编程之美>2.14节的题目. 这篇博文把思路写了一下.在此我要特别说明的是方法二和方法三的自己写的东西. 我把方法二的分治法用C++实现了一下,代码如下: int MAX(int a,int b,int c) { int t=a>b?a:b; return t>c?t:c; } int Array(int a[],int i,int j) { if (i<j) { int q=(i+j)/2,sum1=0,sum2=0,k,Max1=-0x7fffffff,Ma