【面试算法笔记】0105-数组-螺旋矩阵

个人主页:https://github.com/zbhgis

前言

本系列主要记录自己学习算法的过程中的感悟。

力扣59. 螺旋矩阵 II

链接:https://leetcode.cn/problems/spiral-matrix-ii/description/

注意点

定义一个方向变量,决定每次移动的步数与长度

每次走到边缘或者下一个元素有值的时候,就转向。

其他情况就一直走就行。

代码

Java 复制代码
class Solution {
    private static final int[][] DIR = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    public int[][] generateMatrix(int n) {
        int[][] ans = new int[n][n];
        int i = 0;
        int j = 0;
        int d = 0;
        for (int val = 1; val <= n * n; val ++) {
            ans[i][j] = val;
            int nx = i + DIR[d][0];
            int ny = j + DIR[d][1];
            if (nx < 0 || nx >= n || ny < 0 || ny >= n || ans[nx][ny] != 0) {
                d = (d + 1) % 4;
            }
            i += DIR[d][0];
            j += DIR[d][1];
        }
        return ans;
    }
}

时空复杂度分析

时间复杂度为O(n²)

空间复杂度为O(1)

Acwing756. 蛇形矩阵

链接:https://www.acwing.com/problem/content/description/758/

注意点

同上

代码

Java 复制代码
import java.util.Scanner;

public class Main {
    private static final int[][] DIR = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        int[][] ans = new int[m][n];
        int i = 0;
        int j = 0;
        int d = 0;
        for (int val = 1; val <= m * n; val ++) {
            ans[i][j] = val;
            int nx = i + DIR[d][0];
            int ny = j + DIR[d][1];
            if (nx < 0 || nx >= m || ny < 0 || ny >= n || ans[nx][ny] != 0) {
                d = (d + 1) % 4;
            }
            i += DIR[d][0];
            j += DIR[d][1];
        }
        for (i = 0; i < m; i ++) {
            for (j = 0; j < n; j ++) {
                System.out.print(ans[i][j] + " ");
            }
            System.out.println();
        }
    }
}

时空复杂度分析

同上

力扣54. 螺旋矩阵

链接:https://leetcode.cn/problems/spiral-matrix/description/

注意点

与前两题不同的是,这次需要通过matrixij = Integer.MAX_VALUE来判断是不是已经访问过了。其他步骤都一样。

代码

Java 复制代码
class Solution {
    private static final int[][] DIR = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    public List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        List<Integer> ans = new ArrayList<>(m * n);
        int i = 0;
        int j = 0;
        int d = 0;
        for (int k = 1; k <= m * n; k ++) {
            ans.add(matrix[i][j]);
            int nx = i + DIR[d][0];
            int ny = j + DIR[d][1];
            matrix[i][j] = Integer.MAX_VALUE;
            if (nx < 0 || nx >= m || ny < 0 || ny >= n || matrix[nx][ny] == Integer.MAX_VALUE) {
                d = (d + 1) % 4;
            }
            i += DIR[d][0];
            j += DIR[d][1];
        }
        return ans;
    }
}

时空复杂度分析

时间复杂度为O(n²)

空间复杂度为O(1)

力扣LCR 146. 螺旋遍历二维数组

链接:https://leetcode.cn/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/description/

注意点

这一题还需要额外注意当输入的为空数组的情况,这个时候直接返回空数组就行,不要处理。

代码

Java 复制代码
class Solution {
    private static final int[][] DIR = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    public int[] spiralArray(int[][] array) {
        int m = array.length;
        if (m == 0) {
            return new int[0];
        }
        int n = array[0].length;
        int[] ans = new int[m * n];
        int i = 0;
        int j = 0;
        int d = 0;
        for (int k = 0; k < m * n; k ++) {
            ans[k] = array[i][j];
            array[i][j] = Integer.MAX_VALUE;
            int x = i + DIR[d][0];
            int y = j + DIR[d][1];
            if (x < 0 || x >= m || y < 0 || y >= n || array[x][y] == Integer.MAX_VALUE) {
                d = (d + 1) % 4;
            }
            i += DIR[d][0];
            j += DIR[d][1];
        }
        return ans;
    }
}

时空复杂度分析

时间复杂度为O(n²)

空间复杂度为O(1)

参考

https://programmercarl.com/数组理论基础.html

相关推荐
caimouse2 小时前
ReactOS 窗口系统分析(23):键盘 — keyboard.c + kbdlayout.c
c语言·开发语言·计算机外设
Emily156853598702 小时前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
就叫_这个吧7 小时前
Java递归方法实现面包屑导航
java·开发语言
To_OC7 小时前
面试被问了三回三栏布局,这次我终于把 BFC 那层窗户纸捅破了
前端·css·面试
小O的算法实验室7 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
fīɡЙtīиɡ ℡7 小时前
AI 应用系统设计
java·开发语言·人工智能
城管不管7 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅7 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
To_OC7 小时前
啃完 TS 工具类型我发现:Pick 和 Omit 原来就是一层窗户纸
前端·面试·typescript
AI绘画哇哒哒7 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent