螺旋矩阵 | LeetCode-59 | LeetCode-54 | 分类讨论

🙋大家好!我是毛毛张!
🌈个人首页: 神马都会亿点点的毛毛张
🎃分类不好,这道题就做不出来!🎈

📌LeetCode链接:59. 螺旋矩阵 II

📌LeetCode链接:54. 螺旋矩阵

题目1:螺旋矩阵II🍑

1.题目描述🍒

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

示例 1:
在这里插入图片描述

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

2.题解🍅

2.1 直接法-分类讨论🥑

class Solution {
    public int[][] generateMatrix(int n) {
        // 创建一个 n x n 的矩阵,用于存放螺旋顺序的数字
        int[][] result = new int[n][n];
        // 计算需要填充螺旋圈的数量(当 n 为偶数时,正好填满;当 n 为奇数时,中间会剩余一个元素)
        int k = n / 2;
        // 初始化数字计数器,从 1 开始
        int count = 1;
        // 定义四个边界:上、下、左、右
        int top = 0, bottom = n - 1;
        int left = 0, right = n - 1;

        // 循环处理每一层的螺旋圈
        for (int i = 0; i < k; i++) {
            // 从左到右填充当前顶部的一行
            for (int j = left; j < right; j++) result[top][j] = count++;
            // 从上到下填充当前右边的一列
            for (int j = top; j < bottom; j++) result[j][right] = count++;
            // 从右到左填充当前底部的一行
            for (int j = right; j > left; j--) result[bottom][j] = count++;
            // 从下到上填充当前左边的一列
            for (int j = bottom; j > top; j--) result[j][left] = count++;
            // 缩小边界,进入下一层螺旋圈
            left++;
            right--;
            top++;
            bottom--;
        }
        // 如果 n 是奇数,填充矩阵中心的最后一个元素
        if (n % 2 != 0) {
            result[left][top] = count;
        }
        // 返回填充好的螺旋矩阵
        return result;
    }
}

2.2 方法二-解决中心值忘记赋值问题🥥

class Solution {
    public int[][] generateMatrix(int n) {
        // 创建一个 n x n 的矩阵,用于存放螺旋顺序的数字
        int[][] result = new int[n][n];
        // 初始化数字计数器,从 1 开始
        int count = 1;
        // 目标值,表示填充到矩阵中的最大数字
        int target = n * n;
        // 定义四个边界:上、下、左、右
        int top = 0, bottom = n - 1;
        int left = 0, right = n - 1;

        // 开始填充矩阵,直到填满目标值
        while (count <= target) {
            // 从左到右填充当前顶部的一行
            for (int i = left; i <= right; i++) result[top][i] = count++;
            // 填充完一行后,移动上边界下移一行
            top++;
            // 从上到下填充当前右边的一列
            for (int i = top; i <= bottom; i++) result[i][right] = count++;
            // 填充完一列后,移动右边界左移一列
            right--;
            // 从右到左填充当前底部的一行
            for (int i = right; i >= left; i--) result[bottom][i] = count++;
            // 填充完一行后,移动下边界上移一行
            bottom--;
            // 从下到上填充当前左边的一列
            for (int i = bottom; i >= top; i--) result[i][left] = count++;
            // 填充完一列后,移动左边界右移一列
            left++;
        }
        // 返回填充好的螺旋矩阵
        return result;
    }
}

2.3 方法3-通解🍊

class Solution {
    public int[][] generateMatrix(int n) {
        // 创建一个 n x n 的矩阵用于存储结果
        int[][] result = new int[n][n];
        // 初始化从 1 开始的计数器
        int count = 1;
        // 目标计数为 n*n,表示矩阵中应有的最大值
        int target = n * n;
        // 定义四个边界:上(top)、下(bottom)、左(left)、右(right)
        int top = 0, bottom = n - 1;
        int left = 0, right = n - 1;

        // 循环继续,直到所有的边界都相交
        while (left <= right && top <= bottom) {
            // 从左到右填充矩阵的上边界
            for (int i = left; i <= right; i++) result[top][i] = count++;
            // 从上到下填充矩阵的右边界
            for (int i = top + 1; i <= bottom; i++) result[i][right] = count++;
            
            // 确保矩阵中至少有两行两列,然后填充底边和左边
            if (left < right && top < bottom) {
                // 从右到左填充矩阵的下边界
                for (int i = right - 1; i > left; i--) result[bottom][i] = count++;
                // 从下到上填充矩阵的左边界
                for (int i = bottom; i > top; i--) result[i][left] = count++;
            }
            
            // 调整边界,以缩小矩阵范围
            bottom--;
            right--;
            top++;
            left++;
        }

        // 返回生成的螺旋矩阵
        return result;
    }
}

题目2:螺旋矩阵🍈

1.题目描述🍊

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:
在这里插入图片描述

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:
在这里插入图片描述

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

2.题解🍍

2.1 方法1-通解🍌

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        // 创建一个列表用于存储结果
        List<Integer> result = new ArrayList<>();
        // 获取矩阵的行数和列数
        int m = matrix.length;
        int n = matrix[0].length;
        // 定义四个边界:左(left)、右(right)、上(top)、下(bottom)
        int left = 0, right = n - 1;
        int top = 0, bottom = m - 1;
        // 循环执行,直到所有边界重合
        while (left <= right && top <= bottom) {
            // 从左到右填充矩阵的上边界
            for (int i = left; i <= right; i++) result.add(matrix[top][i]);
            // 从上到下填充矩阵的右边界
            for (int i = top + 1; i <= bottom; i++) result.add(matrix[i][right]);
            
            // 确保矩阵中至少有两行两列,然后填充底边和左边
            if (left < right && top < bottom) {
                // 从右到左填充矩阵的下边界
                for (int i = right - 1; i > left; i--) result.add(matrix[bottom][i]);
                // 从下到上填充矩阵的左边界
                for (int i = bottom; i > top; i--) result.add(matrix[i][left]);
            }
            
            // 调整边界,以缩小矩阵范围
            bottom--;  // 下边界上移
            right--;   // 右边界左移
            top++;     // 上边界下移
            left++;    // 左边界右移
        }

        // 返回最终的结果列表
        return result;
    }
}

2.2 方法2🍇

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        // 创建一个列表用于存储结果
        List<Integer> result = new ArrayList<>();

        // 获取矩阵的行数和列数
        int m = matrix.length;
        int n = matrix[0].length;

        // 定义四个边界:左(left)、右(right)、上(top)、下(bottom)
        int left = 0, right = n - 1;
        int top = 0, bottom = m - 1;

        // 循环执行
        while (left <= right && top <= bottom) {
            // 从左到右遍历矩阵的上边界,并将元素加入结果列表
            for (int i = left; i <= right; i++) result.add(matrix[top][i]);

            // 将上边界下移,如果上边界超过下边界,跳出循环
            if (++top > bottom) break;

            // 从上到下遍历矩阵的右边界,并将元素加入结果列表
            for (int i = top; i <= bottom; i++) result.add(matrix[i][right]);
            // 将右边界左移,如果左边界超过右边界,跳出循环
            if (left > --right) break;

            // 从右到左遍历矩阵的下边界,并将元素加入结果列表
            for (int i = right; i >= left; i--) result.add(matrix[bottom][i]);
            // 将下边界上移,如果上边界超过下边界,跳出循环
            if (top > --bottom) break;

            // 从下到上遍历矩阵的左边界,并将元素加入结果列表
            for (int i = bottom; i >= top; i--) result.add(matrix[i][left]);     
            // 将左边界右移,如果左边界超过右边界,跳出循环
            if (++left > right) break;
        }

        // 返回最终的结果列表
        return result;
    }
}

ottom) break;

        // 从下到上遍历矩阵的左边界,并将元素加入结果列表
        for (int i = bottom; i >= top; i--) result.add(matrix[i][left]);     
        // 将左边界右移,如果左边界超过右边界,跳出循环
        if (++left > right) break;
    }

    // 返回最终的结果列表
    return result;
}

}








  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神马都会亿点点的毛毛张

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值