求最小子数组之二维篇
一、设计思路
求出该二维数组的所有子数组,先确定一个位置为起点,然后向右下方依次以此起点为始的所有子数组,
图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
求最小子数组之二维篇相关推荐
- php 数组与数组之间去重,PHP开发中一维数组与二维数组去重功能实现教程
本篇文章讲述了PHP实现一维数组与二维数组去重功能示例.希望对在php学习和开发的同学有所帮助! 数组中重复项的去除 一维数组的重复项: 使用array_unique函数即可,使用实例如下: ? $a ...
- 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )
文章目录 一.二维数组 1.二维数组声明及初始化 2.二维数组遍历 3.二维数组排序 二.完整代码示例 一.二维数组 前几篇博客中 , 介绍的是指针数组 ; 指针数组 的 结构特征 是 , 数组中的每 ...
- 二维数组,锯齿数组和集合 C# 一维数组、二维数组(矩形数组)、交错数组(锯齿数组)的使用 C# 数组、多维数组(矩形数组)、锯齿数组(交叉数组)...
二维数组,锯齿数组和集合 一.二维数组 二维数组: 一维数组----豆角 二维数组----表格 定义: 1.一维数组: 数据类型[] 数组变量名 = new 数据类型[数组长度]; 数据类型[] 数组 ...
- 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组
整篇文章为对java数组的完整理解以及部分排序,并有一些简单的demo,经典的案例与蓝桥杯的一些经典数组题有专门的文章梳理. 目录 数组概述 什么是数组 数组的结构 数组的特点: 数组分类 一维数组声 ...
- 怎样定义和引用一维数组,二维数组
s1,s2,s3,...,s30 右下角的数字称为下标(subscript) 一批具有同名的同属性的数据就组成了一个数组(array),s就是数组名. 1.怎样定义和引用一维数组 一维数组.二维数组. ...
- 【C语言】数组(一维数组、二维数组)
目录 一.一维数组 1.一维数组的创建(定义) 2.一维数组的初始化 3.一维数组的内存分配 二.二维数组 1.二维数组的创建(定义) 2.二维数组的初始化 3.二维数组的内存分配 三.数组越界 四. ...
- Java数组(二维数组)
目录 前言 多维数组 二维数组 声明二维数组 创建二维数组 访问二维数组 遍历二维数组 最后 前言 在上一篇文章Java数组(一维数组)中,我们学习了一维数组,那么今天我们来学习Java二维数组. 多 ...
- NumPy一维数组、二维数组与Pandas的Series、DataFrame行列结构和横纵方向的统一说明
最近在这个问题上耽误了一些时间,原因是之前个人理解上出了一些偏差,又受到错误文章的误导,把这个问题搞复杂了,现在统一梳理一下.在展开之前,先明确说明的是:NumPy的二维数组与Pandas的DataF ...
- python一维数组和二维数组_Python numpy实现二维数组和一维数组拼接的方法
Python numpy实现二维数组和一维数组拼接的方法 撰写时间:2017.5.23 一维数组 1.numpy初始化一维数组 a = np.array([1,2,3]); print a.shape ...
最新文章
- js关闭窗口无提示,不支持FF
- 每日一皮:好像有个Bug... 你看到了吗?
- Java8函数式编程(3)--规约操作
- Oracle数据导入要多久,oracle数据库备份导入要注意的几个问题
- ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式
- ES6精华: 解构运算符 扩展运算符 剩余运算符
- Visual studio 2013安装及单元测试
- SQL Server – QP的另一个X射线
- 中心极限定理_达尔文的进化论正确吗?
- 路由器网络性能测试软件,路由器压力测试工具 路由器UDP攻击软件 路由器性能测试...
- jeesit 基于springMVC + mybatis配置多数据源的问题
- java整钱兑零美元换算成美分,人民币和美元大写格式在线工具,美元美金数字金额转换大写,外币大写金额...
- TypeScript初始化
- java session logout_Spring Session Logout
- 用词误导:无症状指的是无肺炎症状,发烧40度、很疼痛都是无症状
- 简单分析市场上从不会缺席的场外交易模式
- SSR、SSE、SST、R2
- 单片机 李广弟_单片机基础(第3版)
- 小桥加加的英语学习博客
- 2021年江苏一级计算机报名时间,江苏2021年3月计算机一级报名时间安排
热门文章
- java设计模式-代理模式初探
- SpringCloud(一):深入理解Eureka
- Win8Metro(C#)数字图像处理--2.12Sobel边缘检测
- eclipse + maven搭建SSM框架
- oracle-25031安装错误分析解决
- ubuntu通过xmange连接桌面
- 服务器硬盘SAS与SATA区别介绍
- 填写各类表格时有时在多个选择前有小方框 在其中打勾
- 画正圆角矩形 - HTML5 Canvas 作图
- 电脑开机出现C:\Windows\System32\drivers\fs_rec.sys