一、设计思路

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

图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

相关文章:

  • 2021-11-14
  • 2021-08-02
  • 2022-02-17
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-23
猜你喜欢
  • 2021-10-08
  • 2021-09-27
  • 2021-06-04
  • 2022-02-05
相关资源
相似解决方案