YF云飞 2023-05-07 15:46 采纳率: 65%
浏览 99
已结题

请问我的代码哪里需要做修改呢(标签-java|关键词-java代码)

img

结果应该是:

img

但我的测试结果是:

img

代码如下:


class Solution {
    public int rampartDefensiveLine(int[][] rampart) {
        int maxLen = 0;
        int n = rampart.length;
        int m = rampart[0].length;
        int[][] dp = new int[n][m];

    for (int j = 0; j < m; j++) {
        for (int i = n - 1; i >= 0; i--) {
            if (rampart[i][j] == 0) {
                dp[i][j] = 0;
            } else {
                dp[i][j] = i == n - 1 ? 1 : dp[i + 1][j] + 1;
            }
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int len = dp[i][j];
            for (int k = j + 1; k < m && dp[i][k] > 0; k++) {
                if (dp[i][k] < len) {
                    len = dp[i][k];
                }
                maxLen = Math.max(maxLen, (k - j + 1) * len);
            }
        }
    }

    return maxLen;
}

}

请问我的代码哪里需要做修改呢?或是新的思路也可以,需要代码java代码谢谢

  • 写回答

1条回答 默认 最新

  • CSDN专家-sinJack 2023-05-07 15:58
    关注

    修改后的代码如下:

    class Solution {
        public int rampartDefensiveLine(int[][] rampart) {
            int maxLen = 0;
            int n = rampart.length;
            int m = rampart[0].length;
            int[][] dp = new int[n][m];
            for (int j = 0; j < m; j++) {
                for (int i = n - 1; i >= 0; i--) {
                    if (rampart[i][j] == 0) {
                        dp[i][j] = 0;
                    } else {
                        dp[i][j] = i == n - 1 ? 1 : dp[i + 1][j] + 1;
                    }
                }
            }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    int len = dp[i][j];
                    for (int k = j + 1; k < m && dp[i][k] > 0; k++) {
                        if (dp[i][k] < len) {
                            len = dp[i][k];
                        }
                        int left = j - len + 1;
                        int right = k + len - 1;
                        if (left >= 0 && right < m) {
                            boolean overlap = false;
                            for (int p = 0; p < n; p++) {
                                if (p != i && dp[p][j] >= len && dp[p][k] >= len) {
                                    overlap = true;
                                    break;
                                }
                            }
                            if (!overlap) {
                                maxLen = Math.max(maxLen, right - left + 1);
                            }
                        }
                    }
                }
            }
            return maxLen;
        }
    } 
    

    计算城墙膨胀后的区间时,需要同时考虑城墙向左、向右、向两个方向膨胀的情况。因此,需要计算出城墙向左、向右、向两个方向膨胀后的左右边界,然后判断是否与其他城墙重叠。如果没有重叠,则更新最大长度。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月7日
  • 赞助了问题酬金15元 5月7日
  • 创建了问题 5月7日

悬赏问题

  • ¥30 seata使用出现报错,其他服务找不到seata
  • ¥35 引用csv数据文件(4列1800行),通过高斯-赛德尔法拟合曲线,在选取(每五十点取1点)数据,求该数据点的曲率中心。
  • ¥20 程序只发送0X01,串口助手显示不正确,配置看了没有问题115200-8-1-no,如何解决?
  • ¥15 Google speech command 数据集获取
  • ¥15 vue3+element-plus页面崩溃
  • ¥15 像这种代码要怎么跑起来?
  • ¥15 安卓C读取/dev/fastpipe屏幕像素数据
  • ¥15 pyqt5tools安装失败
  • ¥15 mmdetection
  • ¥15 nginx代理报502的错误