• ​力扣解法汇总764. 最大加号标志


     目录链接:

    力扣编程题-解法汇总_分享+记录-CSDN博客

    GitHub同步刷题项目:

    https://github.com/September26/java-algorithms

    原题链接:力扣


    描述:

    在一个 n x n 的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1mines[i] = [xi, yi]表示 grid[xi][yi] == 0

    返回  grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志,则返回 0 。

    一个 k 阶由 1 组成的 “轴对称”加号标志 具有中心网格 grid[r][c] == 1 ,以及4个从中心向上、向下、向左、向右延伸,长度为 k-1,由 1 组成的臂。注意,只有加号标志的所有网格要求为 1 ,别的网格可能为 0 也可能为 1 。

    示例 1:

     

    输入: n = 5, mines = [[4, 2]]
    输出: 2
    解释: 在上面的网格中,最大加号标志的阶只能是2。一个标志已在图中标出。
    

    示例 2:

     

    输入: n = 1, mines = [[0, 0]]
    输出: 0
    解释: 没有加号标志,返回 0 。
    

    提示:

    • 1 <= n <= 500
    • 1 <= mines.length <= 5000
    • 0 <= xi, yi < n
    • 每一对 (xi, yi) 都 不重复

    解题思路:

    * 解题思路:
    * 我们先用一种最笨的方法来实现,首先构建一个二维数组,对应的就是n*n的矩阵上的每个数字的值,然后把mines进行填充。
    * 然后从最中间开始搜索,一层一层往外搜索每个点所对应的最大阶数,如果最大阶数达到理论上的最大值,则直接返回即可。
    * 然后我们再看如何优化,每一行进行遍历搜索的时候,如果第n位读到了0,则说明至少n+i范围内,最大值就是i,而且如果存在,这个点的坐标一定是n+i。
    * 此时,我们可以让当前的最大长度result为i,直接跳过中间的部分,直接从n+result位开始搜索,大幅节省计算时间。
    * 这个优化方案就先不写了

    代码:

    1. public class Solution764 {
    2. public int orderOfLargestPlusSign(int n, int[][] mines) {
    3. int[][] matrix = new int[n][n];
    4. for (int i = 0; i < matrix.length; i++) {
    5. for (int j = 0; j < matrix.length; j++) {
    6. matrix[i][j] = 1;
    7. }
    8. }
    9. for (int[] mine : mines) {
    10. matrix[mine[0]][mine[1]] = 0;
    11. }
    12. int result = 0;
    13. int centerX = n % 2 == 1 ? (n - 1) / 2 : n / 2;
    14. for (int step = 0; step <= centerX; step++) {
    15. for (int y = centerX - step; y <= centerX + step; y++) {
    16. int maxLength = centerX - step + 1;
    17. for (int x = centerX - step; x <= centerX + step; x++) {
    18. result = Math.max(result, searchMaxLength(x, y, matrix, maxLength));
    19. if (maxLength == result) {
    20. return result;
    21. }
    22. }
    23. }
    24. }
    25. return result;
    26. }
    27. private int searchMaxLength(int x, int y, int[][] matrix, int maxlength) {
    28. if (y < 0 || y >= matrix.length || x < 0 || x >= matrix.length) {
    29. return 0;
    30. }
    31. int value = matrix[y][x];
    32. if (value == 0) {
    33. return 0;
    34. }
    35. int length = 1;
    36. for (; length <= maxlength; ) {
    37. if (y + length >= matrix.length || matrix[y + length][x] == 0) {
    38. break;
    39. }
    40. if (y - length < 0 || matrix[y - length][x] == 0) {
    41. break;
    42. }
    43. if (x + length >= matrix.length || matrix[y][x + length] == 0) {
    44. break;
    45. }
    46. if (x - length < 0 || matrix[y][x - length] == 0) {
    47. break;
    48. }
    49. length++;
    50. }
    51. return length;
    52. }
    53. }

  • 相关阅读:
    wx.getPrivacySetting 小程序隐私保护指引的使用(复制粘贴即用)
    gRPC 协议缓冲区
    lLinux环境变量
    申诉解决TeamViewer免费个人版被误判为商业使用
    超耐心地毯式分析,来试试这道看似简单但暗藏玄机的Promise顺序执行题
    python学习6
    [论文阅读] 颜色迁移-N维pdf迁移
    WPF Binding对象、数据校验、数据转换
    windows音频服务未响应,电脑装完驱动还是软件导致没有声音
    先进制造aps专题三 为什么java语言不适合作为aps算法的开发语言
  • 原文地址:https://blog.csdn.net/AA5279AA/article/details/127767364