当前位置:实例文章 » JAVA Web实例» [文章]甲板上的战舰(力扣)递归 JAVA

甲板上的战舰(力扣)递归 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)。

其他信息

其他资源

Top