螺旋矩阵 II:详解「形状」解法 &「方向」解法 | Java 刷题打卡

简介: 螺旋矩阵 II:详解「形状」解法 &「方向」解法 | Java 刷题打卡

网络异常,图片无法展示
|

题目描述



这是 LeetCode 上的 59. 螺旋矩阵 II ,难度为 中等


Tag : 「模拟」


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


示例 1:


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


示例 2:


输入:n = 1
输出:[[1]]
复制代码


提示:


  • 1 <= n <= 20


按照「形状」进行模拟



我们可以按「圈」进行构建。


使用「左上角」(x1,y1)(x1,y1) &「右下角」(x2,y2)(x2,y2) 来确定某个「圈」,进行构建。


完成后,令「左上角」&「右下角」往里收,分别得到 (x1 + 1, y1 + 1)(x1+1,y1+1)(x2 - 1, y2 - 1)(x21,y21),执行相同的构建规则。


网络异常,图片无法展示
|


代码:


class Solution {
    public int[][] generateMatrix(int n) {
        int[][] ans = new int[n][n];
        circle(0, 0, n - 1, n - 1, 1, ans);
        return ans;
    }
    void circle(int x1, int y1, int x2, int y2, int start, int[][] ans) {
        if (x2 < x1 || y2 < y1) return ;
        if (x1 == x2) {
            ans[x1][y1] = start;
            return;
        }
        int val = start;
        for (int i = y1; i < y2; i++) ans[x1][i] = val++;
        for (int i = x1; i < x2; i++) ans[i][y2] = val++;
        for (int i = y2; i > y1; i--) ans[x2][i] = val++;
        for (int i = x2; i > x1; i--) ans[i][y1] = val++;
        circle(x1 + 1, y1 + 1, x2 - 1, y2 - 1, val, ans); 
    }
}
复制代码


  • 时间复杂度:O(n^2)O(n2)
  • 空间复杂度:O(n^2)O(n2)


按照「方向」进行模拟



事实上,我们还可以根据「方向」进行模拟。


因为每一圈的构建都是按照特定的「四个方向」进行的。


这种解法更为简洁。而触发方向转换的时机:


  1. 下一步发生位置溢出
  2. 回到了本圈的起点


网络异常,图片无法展示
|


代码:


class Solution {
    public int[][] generateMatrix(int n) {
        int[][] ans = new int[n][n];
        // 定义四个方向
        int[][] dirs = new int[][]{{0,1},{1,0},{0,-1},{-1,0}};
        for (int x = 0, y = 0, d = 0, i = 1; i <= n * n; i++) {
            ans[x][y] = i;
            // 下一步要到达的位置
            int nx = x + dirs[d][0], ny = y + dirs[d][1];
            // 如果下一步发生「溢出」或者已经访问过(说明四个方向已经走过一次)
            if (nx < 0 || nx >= n || ny < 0 || ny >= n || ans[nx][ny] != 0) {
                d = (d + 1) % 4;
                nx = x + dirs[d][0];
                ny = y + dirs[d][1];
            }
            x = nx;
            y = ny;
        }
        return ans;
    }
}
复制代码


  • 时间复杂度:O(n^2)O(n2)
  • 空间复杂度:O(n^2)O(n2)


最后



这是我们「刷穿 LeetCode」系列文章的第 No.59 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
350 6
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
251 1
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
284 1
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
242 6
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
266 0
|
存储 算法 Java
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
268 0
八皇后问题92种解法(java)
八皇后问题92种解法(java)
186 0
|
Java
杭电 OJ 1010-1019 Java解法(未更新完毕)
杭电 OJ 1010-1019 Java解法(未更新完毕)
210 1
|
Java
杭电acm1201 18岁生日 Java解法 时间类
杭电acm1201 18岁生日 Java解法 时间类
167 0
|
算法 Java
杭电 OJ 1000-1009 Java解法
杭电 OJ 1000-1009 Java解法
181 0