一、设计思路

求出该二维数组的所有子数组,先确定一个位置为起点,然后向右下方依次以此起点为始的所有子数组,

图1—顺序求子数组

具体如上图1,顺序求出子数组,然后和max值相比较,若比max值大,则将该子数组和赋给max,并保存其位置,对该子数组的位置,只需要保存其首尾位置即可,

图2—保存子数组位置

如上图2所示,得到了最大子数组和与其位置,输出即可。

二、代码

 1 package zishuzu;
 2
 3 import java.util.*;
 4
 5 public class zuixiaozishuzu {
 6
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9
10         int m,n,M,N,max,sum;
11         int i,i1,i2,j,j1,j2;
12         int shouL,shouR,weiL,weiR;
13         Scanner sc = new Scanner(System.in);
14         System.out.println("输入二维数组的行数和列数:");
15         m =    sc.nextInt();
16         n = sc.nextInt();
17         System.out.println("输入该二位数组的取值范围(保证第一个数小于第二个数):");
18         M = sc.nextInt();
19         N = sc.nextInt();
20
21         int[][] Shuzu = new int[m][n];
22         for(i = 0;i < m;i++)
23             for(j = 0;j < n;j++)
24             {
25                 Shuzu[i][j] = N + (int)(Math.random()*(M - N));
26             }
27         System.out.println("该随机二维数组为:");
28         for(i = 0;i < m;i++)
29             for(j = 0;j < n;j++)
30             {
31                 System.out.print(Shuzu[i][j]+"\t");
32                 if(j == n - 1)
33                 {
34                     System.out.print("\n");
35                 }
36             }
37
38         sum =0;
39         max = Shuzu[0][0];
40         shouL = 0;
41         shouR = 0;
42         weiL = 0;
43         weiR = 0;
44
45         for(i = 0;i < m;i++)
46         {
47             for(j = 0;j < n;j++)
48             {
49                 for(i1 = i;i1 < m;i1++)
50                 {
51                     for(j1 = j;j1 < n;j1++)
52                     {
53                         for(i2 = i;i2 <= i1;i2++)
54                         {
55                             for(j2 = j;j2 <= j1;j2++)
56                             {
57                                 sum = sum + Shuzu[i2][j2];
58                             }
59                         }
60                         if(max <= sum)
61                         {
62                             max = sum;
63                             shouL = i;
64                             shouR = j;
65                             weiL = i1;
66                             weiR = j1;
67                         }
68                         sum = 0;
69                     }
70                 }
71             }
72         }
73
74         System.out.println("最大子数组和为:");
75         System.out.println(max);
76         System.out.println("最大子数组为:");
77         for(i = shouL;i <= weiL;i++)
78             for(j = shouR;j <= weiR;j++)
79             {
80                 System.out.print(Shuzu[i][j] + "\t");
81                 if(j == weiR)
82                 {
83                     System.out.print("\n");
84                 }
85             }
86
87         sc.close();
88     }

View Code

三、实验结果

图3—结果1

图4—结果2

图5—结果3

四、开发过程

一个二维数组,当看到求最小子数组时,立马蹦出的想法就是求出这个二维数组的每一个子数组,虽然想法普通,时间复杂度高,却也不用考虑很多的特殊情况,出错的风险低了许多。

设计之初就是一个时间复杂度为n6的一个思路,第一层即最外层是关于起始位置的循环,第二层是关于终止位置的循环,最里层则是该子数组的自加求和,每层有两个for循环。

在一开始编写时,将循环时的值设为i,ii,iii,j,jj,jjj,运行时却失败了,花了两节课怎么也找不到错误,突然想起同伴的提醒:为什么不用i,i1,i2,j1,j1,j2,这样不是更容易看点,于是便将所有值该了过来,改到最后一个jjj值时,才发现,我是将“jjj”写成了“jj”,导致了程序的无限循环。

在研究错误的两节课里,经同伴提醒,想要减少时间复杂度,就是修改每层的for循环,减少一个,将i++写在for循环内,具体代码如下:

 1 i = 0;
 2         for(j = 0;j < n;j++)
 3         {
 4             i1 = i;
 5             for(j1 =j;j1 < n;j1++)
 6             {
 7                 i2 = i;
 8                 for(j2 = j;j2 <= j1;j2++)
 9                 {
10                     sum += Shuzu[i2][j2];
11                     if((j2 == j1)&&(i2 < i1))
12                     {
13                         i2++;
14                         j2 = j;
15                     }
16                     else if(j2 == j1&&i2 == i1)
17                     {
18                         break;
19                     }
20                 }
21                 if(max < sum)
22                 {
23                     max = sum;
24                     shouL = i;
25                     shouR = j;
26                     weiL = i1;
27                     weiR = j1;
28                 }
29                 sum = 0;
30                 if(j1 == n -1 && i1 < m -1)
31                 {
32                     i1++;
33                     j1 = j;
34                 }
35                 else if(j1 == n-1 && j1 == m - 1)
36                 {
37                     break;
38                 }
39             }
40             if(j == n - 1 && j < m - 1)
41             {
42                 i++;
43                 j = 0;
44             }
45             else if(j == n - 1 && j == m - 1)
46             {
47                 break;
48             }
49         }    

View Code

能运行出来,可检验时发现有的运算结果是错误的,所以就先用了第一种方法。
  这个程序还可以稍作改进,就是当存在最大子数组和相同的子数组时,将所有数组都输出,可以用数组来保存。

五、结对开发成员

刘双渤,刘洪阳

转载于:https://www.cnblogs.com/little-clever/p/4412637.html

求最小子数组之二维篇相关推荐

  1. php 数组与数组之间去重,PHP开发中一维数组与二维数组去重功能实现教程

    本篇文章讲述了PHP实现一维数组与二维数组去重功能示例.希望对在php学习和开发的同学有所帮助! 数组中重复项的去除 一维数组的重复项: 使用array_unique函数即可,使用实例如下: ? $a ...

  2. 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

    文章目录 一.二维数组 1.二维数组声明及初始化 2.二维数组遍历 3.二维数组排序 二.完整代码示例 一.二维数组 前几篇博客中 , 介绍的是指针数组 ; 指针数组 的 结构特征 是 , 数组中的每 ...

  3. 二维数组,锯齿数组和集合 C# 一维数组、二维数组(矩形数组)、交错数组(锯齿数组)的使用 C# 数组、多维数组(矩形数组)、锯齿数组(交叉数组)...

    二维数组,锯齿数组和集合 一.二维数组 二维数组: 一维数组----豆角 二维数组----表格 定义: 1.一维数组: 数据类型[] 数组变量名 = new 数据类型[数组长度]; 数据类型[] 数组 ...

  4. 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组

    整篇文章为对java数组的完整理解以及部分排序,并有一些简单的demo,经典的案例与蓝桥杯的一些经典数组题有专门的文章梳理. 目录 数组概述 什么是数组 数组的结构 数组的特点: 数组分类 一维数组声 ...

  5. 怎样定义和引用一维数组,二维数组

    s1,s2,s3,...,s30 右下角的数字称为下标(subscript) 一批具有同名的同属性的数据就组成了一个数组(array),s就是数组名. 1.怎样定义和引用一维数组 一维数组.二维数组. ...

  6. 【C语言】数组(一维数组、二维数组)

    目录 一.一维数组 1.一维数组的创建(定义) 2.一维数组的初始化 3.一维数组的内存分配 二.二维数组 1.二维数组的创建(定义) 2.二维数组的初始化 3.二维数组的内存分配 三.数组越界 四. ...

  7. Java数组(二维数组)

    目录 前言 多维数组 二维数组 声明二维数组 创建二维数组 访问二维数组 遍历二维数组 最后 前言 在上一篇文章Java数组(一维数组)中,我们学习了一维数组,那么今天我们来学习Java二维数组. 多 ...

  8. NumPy一维数组、二维数组与Pandas的Series、DataFrame行列结构和横纵方向的统一说明

    最近在这个问题上耽误了一些时间,原因是之前个人理解上出了一些偏差,又受到错误文章的误导,把这个问题搞复杂了,现在统一梳理一下.在展开之前,先明确说明的是:NumPy的二维数组与Pandas的DataF ...

  9. python一维数组和二维数组_Python numpy实现二维数组和一维数组拼接的方法

    Python numpy实现二维数组和一维数组拼接的方法 撰写时间:2017.5.23 一维数组 1.numpy初始化一维数组 a = np.array([1,2,3]); print a.shape ...

最新文章

  1. js关闭窗口无提示,不支持FF
  2. 每日一皮:好像有个Bug... 你看到了吗?
  3. Java8函数式编程(3)--规约操作
  4. Oracle数据导入要多久,oracle数据库备份导入要注意的几个问题
  5. ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式
  6. ES6精华: 解构运算符 扩展运算符 剩余运算符
  7. Visual studio 2013安装及单元测试
  8. SQL Server – QP的另一个X射线
  9. 中心极限定理_达尔文的进化论正确吗?
  10. 路由器网络性能测试软件,路由器压力测试工具 路由器UDP攻击软件 路由器性能测试...
  11. jeesit 基于springMVC + mybatis配置多数据源的问题
  12. java整钱兑零美元换算成美分,人民币和美元大写格式在线工具,美元美金数字金额转换大写,外币大写金额...
  13. TypeScript初始化
  14. java session logout_Spring Session Logout
  15. 用词误导:无症状指的是无肺炎症状,发烧40度、很疼痛都是无症状
  16. 简单分析市场上从不会缺席的场外交易模式
  17. SSR、SSE、SST、R2
  18. 单片机 李广弟_单片机基础(第3版)
  19. 小桥加加的英语学习博客
  20. 2021年江苏一级计算机报名时间,江苏2021年3月计算机一级报名时间安排

热门文章

  1. java设计模式-代理模式初探
  2. SpringCloud(一):深入理解Eureka
  3. Win8Metro(C#)数字图像处理--2.12Sobel边缘检测
  4. eclipse + maven搭建SSM框架
  5. oracle-25031安装错误分析解决
  6. ubuntu通过xmange连接桌面
  7. 服务器硬盘SAS与SATA区别介绍
  8. 填写各类表格时有时在多个选择前有小方框 在其中打勾
  9. 画正圆角矩形 - HTML5 Canvas 作图
  10. 电脑开机出现C:\Windows\System32\drivers\fs_rec.sys