【问题标题】:How can we print all sub matrices of a given 2D matrix in Java?我们如何在 Java 中打印给定二维矩阵的所有子矩阵?
【发布时间】:2017-08-05 23:58:00
【问题描述】:

假设我有一个大小为 5*6 的矩阵。 我需要所有子矩阵,即大小为 1*1、1*2、2*5、3*2、5*4 等。 如何获得?

for (i = 0; i < n; i++) {
 for (j = 0; j < m; j++) {
  int arr[][] = new int[i + 1][j + 1];
  for (x = 0; x < i + 1; x++) {
   for (y = 0; y < j + 1; y++) {
    arr[x][y] = a[x][y];
    System.out.print(arr[x][y] + "  ");
   }
   System.out.println();
  }
  System.out.println("*********next********");
 }
}

这是我到目前为止的代码。但这只是从 0,0 索引开始打印所需大小的子数组。

【问题讨论】:

  • 您是否尝试过编写任何代码?你能发布你到目前为止所拥有的东西吗
  • 是的。我已附上我的代码。
  • 请发布minimal reproducible example 包括测试用例数据

标签: java arrays matrix submatrix


【解决方案1】:

你可以试试这个代码:

public static void printMatrix (int columnStart, int rowStart, int columnSize, int rowSize, int[][] matrix) {
    if (columnStart+columnSize>matrix[0].length) return;
    if (rowStart+rowSize>matrix.length) return;
    for (int i=rowStart;i<rowStart+rowSize;i++) {
      for (int j=columnStart;j<columnStart+columnSize;j++) {
        System.out.print(matrix[i][j]+" ");
      }
      System.out.println();
    }
    System.out.println("*********next********");
  }

  public static void printAllSubMatrices (int[][] matrix) {
    for (int i=0;i<matrix.length;i++) {
      for (int m=1;m<matrix.length-i+1;m++) {
        for (int j=0;j<matrix[0].length;j++) {
          for (int n=1;n<matrix[0].length-j+1;n++) {
            printMatrix(j, i, n, m, matrix);
          }
        }
      }
    }
  }
  public static void main(String[] args) {
    int[][] matrix = {{1,2,3},{4,5,6},{7,8,9}};
    //This will print you all the 36 sub-matrices of 3X3 matrix
    printAllSubMatrices(matrix);
  }

【讨论】:

  • 但此代码不适用于非方阵。我们应该如何为 M*N 矩阵编码?
  • 我明天可以查看它以确认 - 但我认为它应该适用于任何 n*m 矩阵。我在代码的主体中给出了 3x3 矩阵仅作为示例。您应该能够使用 3x4 矩阵获得正确的结果。如果您发现问题,请告诉我您所看到的 - 我会提供解决方案。
  • 我尝试了一个 2*3 矩阵 = {{1,2,3},{4,5,6}}。但它没有显示所有子矩阵。
  • 好的。我明天早上再看看。
  • 已修复 - 这是 (int n=1;n
【解决方案2】:

这是一个 O(n^6) Brute force 的问题。

int a[][]= new int [m][n];
for(int i =0 ; i<m;i++)
for(int j=0;j<n;j++)
for(int r=i;i<m;i++)
for(int c=j;c<n;c++)
for(int l1=i ;l1<r;l1++)
for(int l2=j; l2<c;l2++)
 print a[l1][l2];

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多