求二维数组最大子数组

结对队友:胡康臻、杨寒寒

1、设计思想:

首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生;

然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只存放最大的子数组,以及记录最大子数组的位置,从第一个数开始每行每列进行求和比较,以求得最大子数组的值,以及最大子数组所包含的数;

最后进行结果的输出与验证。

2、代码

import java.util.*;

public class zuixiaozishuzu {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int m,n,M,N,max,sum;
        int i,i1,i2,j,j1,j2;
        int shouL,shouR,weiL,weiR;
        Scanner sc = new Scanner(System.in);
        System.out.println("输入二维数组的行数和列数:");
        m =    sc.nextInt();
        n = sc.nextInt();
        System.out.println("输入该二位数组的取值范围(保证第一个数小于第二个数):");
        M = sc.nextInt();
        N = sc.nextInt(); 

        int[][] Shuzu = new int[m][n];
        for(i = 0;i < m;i++)
            for(j = 0;j < n;j++)
            {
                Shuzu[i][j] = N + (int)(Math.random()*(M - N));
            }
        System.out.println("该随机二维数组为:");
        for(i = 0;i < m;i++)
            for(j = 0;j < n;j++)
            {
                System.out.print(Shuzu[i][j]+"\t");
                if(j == n - 1)
                {
                    System.out.print("\n");
                }
            }

        sum =0;
        max = Shuzu[0][0];
        shouL = 0;
        shouR = 0;
        weiL = 0;
        weiR = 0;

        i = 0;
        for(j = 0;j < n;j++)
        {
            i1 = i;
            for(j1 =j;j1 < n;j1++)
            {
                i2 = i;
                for(j2 = j;j2 <= j1;j2++)
                {
                    sum += Shuzu[i2][j2];
                    if((j2 == j1)&&(i2 < i1))
                    {
                        i2++;
                        j2 = j;
                    }
                    else if(j2 == j1&&i2 == i1)
                    {
                        break;
                    }
                }
                if(max < sum)
                {
                    max = sum;
                    shouL = i;
                    shouR = j;
                    weiL = i1;
                    weiR = j1;
                }
                sum = 0;
                if(j1 == n -1 && i1 < m -1)
                {
                    i1++;
                    j1 = j;
                }
                else if(j1 == n-1 && j1 == m - 1)
                {
                    break;
                }
            }
            if(j == n - 1 && j < m - 1)
            {
                i++;
                j = 0;
            }
            else if(j == n - 1 && j == m - 1)
            {
                break;
            }
        }        

        System.out.println("最大子数组和为:");
        System.out.println(max);
        System.out.println("最大子数组为:");
        for(i = shouL;i <= weiL;i++)
            for(j = shouR;j <= weiR;j++)
            {
                System.out.print(Shuzu[i][j] + "\t");
                if(j == weiR)
                {
                    System.out.print("\n");
                }
            }

        sc.close();
    }

}

3、截图

时间: 2024-10-17 16:13:38

求二维数组最大子数组的相关文章

结对开发(求二维首尾相接数组的最大子数组和)

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 一.设计思想 求环形二维数组最大子数组的和,可以转化为求一维数组最大子数组的和 我们有一个最初的二维数组a[n][n]找它的 最大子数组之和 1.我们先建立一个新的二维数组b[n][2*n-1], 2,这个新的二维数组就是将初始的二

软件工程结对开发之求二维数组中连续最大子数组之和2

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 先调用以前求二维最大连续子数组之和的maxSubArray函数求一个首尾不相邻的二维最大连续子数组之和,接着用将第k列各元素左移一列可以再求一个最大连续子数组之和 ,循环m次(因为原二维数组有m列)求得每个

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

结对开发成员:朱少辉,侯涛亮 朱少辉:负责程序分析,代码编程 侯涛亮:负责代码复审和代码测试 设计思路: 根据求一维子数组的最大子数组和的列子,把二维数组分解成若干个一维子数组,如m行n列的数组可分为(m+1)*m/2个子数组,在求每个一维数组的最大子数组和,把这些和放入一个数组中,求这个数组的最大值就是二维数组最大子数组的和.这种算法的时间复杂度为o(n^3). 代码: #include<iostream> using namespace std; void main() { int m,n

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

设计思路: 因为之前做过二维数组的和环形一维数组的,所以第一感觉就是能不能把这两种整改一下结合起来,所以采用的做法就是将二维环形变化为一维环形,在此采用的方法是从第一行开始,第一行计算出最大子数组,然后第一行和第二行相加为一维计算最大子数组,然后第一行.第二行和第三行,以此类推,最后将各子数组的最大值进行比较,得到最大的即为子数组和的最大值. 实验代码: //环形一维数组求最大子数组 package erwei; public class oneArray { private int i; pu

求二维数组中子数组和中最大的值,及子数组

求二维数组中子数组和中最大的值,及子数组 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 每次着急写程序,碰到问题就头疼,头疼之后便是满满的收获,付出总有回报. 题目 求

软件工程概论---环状二维数组最大子数组和

1,题目要求 根据软件工程概论--<环状一维数组最大子数组和>和<二维数组最大子数组和>两篇博客,求环状二维数组的和. 2,思路设计 根据前面两篇博客思路做参考.在二维数组的基础上扩充二维数组的列为2*col-1.再进行二维数组的求和即可. 3,代码 #include <iostream> #include<time.h> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) #define M

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

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

结对开发——求二维环形数组所有子矩阵最大和的问题

一.题目要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.解决思路: 由于上次我们做过求二维数组最大子矩阵和的问题,又做了求一维环状数组的子数组最大值问题,这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果.

首尾相连的二维数组最大子数组求和

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

循环二维数组最大子数组

一.题目与要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 通过上次求解简单一维回环数组的最大子数组问题的解决,我们采取的方法并不是时间复杂度为o(n)的算法.关于实现数组回环,我们的方法仍是定义一个二倍长数组来首尾存取两次待求数组,以此解决回环. 三.源代码 1