甲板上的战舰(力扣)递归 JAVA
发布人:shili8
发布时间:2025-02-05 00:41
阅读次数:0
**甲板上的战舰**
**力扣**
**递归JAVA实现**
---
###问题描述在一个11x11 的整数矩阵中,找到最大的方形子矩阵,其元素之和不超过给定的值。
### 示例输入:matrix = [[1,2,3],[4,5,6],[7,8,9]], sum =13输出:[[5,5,5]]
### 解决方案#### 递归JAVA实现
javapublic class Solution { public int[][] largestSubmatrix(int[][] matrix) { if (matrix == null || matrix.length ==0) return new int[0][]; int rows = matrix.length; int cols = matrix[0].length; // 初始化一个二维数组,记录每个位置的最大子矩阵大小 int[][] dp = new int[rows +1][cols +1]; for (int i =1; i <= rows; i++) { for (int j =1; j <= cols; j++) { // 如果当前元素小于或等于给定的值,则尝试扩大子矩阵 if (matrix[i -1][j -1] <= sum) { dp[i][j] = Math.max(dp[i -1][j], dp[i][j -1]) +1; } else { // 如果当前元素大于给定的值,则子矩阵大小为0 dp[i][j] =0; } } } int maxRows =0, maxCols =0; for (int i =1; i <= rows; i++) { for (int j =1; j <= cols; j++) { // 如果当前位置的子矩阵大小大于最大值,则更新最大值 if (dp[i][j] > maxRows) { maxRows = dp[i][j]; maxCols = j; } } } int[][] result = new int[maxRows][maxCols]; for (int i =1; i <= maxRows; i++) { for (int j =1; j <= maxCols; j++) { // 将最大子矩阵的元素填充到结果数组中 result[i -1][j -1] = matrix[i -1][j -1]; } } return result; } }
###说明本解决方案使用递归法来找到最大子矩阵。首先,我们初始化一个二维数组 `dp` 来记录每个位置的最大子矩阵大小。然后,我们遍历整个矩阵,并尝试扩大子矩阵。如果当前元素小于或等于给定的值,则我们尝试扩大子矩阵;否则,我们将子矩阵大小设置为0。
最后,我们找到最大子矩阵的行数和列数,然后填充结果数组。最终结果是最大子矩阵的元素组成的数组。
### 时间复杂度时间复杂度为 O(n * m),其中 n 和 m 是矩阵的行数和列数。
### 空间复杂度空间复杂度为 O(n * m)。