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日

悬赏问题

  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥15 想用@vueuse 把项目动态改成深色主题,localStorge里面的vueuse-color-scheme一开始就给我改成了dark,不知道什么原因(相关搜索:背景颜色)
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备
  • ¥100 如何用js写一个游戏云存档
  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上