0023【数组】中等LeetCode2326.螺旋矩阵Ⅳ

该文介绍了一种编程问题,涉及创建一个螺旋矩阵并用链表中的整数填充。给定矩阵的维度m和n以及链表头节点,程序需按螺旋顺序填充矩阵,剩余位置用-1填充。文中提供了两种解决方案,一种是优化版,另一种是详细版,通过迭代和判断来实现螺旋填充。
摘要由CSDN通过智能技术生成

目录

1.题目描述

难度:中等

给你两个整数:m 和 n ,表示矩阵的维数。
另给你一个整数链表的头节点 head
请你生成一个大小为 m x n 的螺旋矩阵,矩阵包含链表中的所有整数。链表中的整数从矩阵 左上角 开始、顺时针 按 螺旋 顺序填充。如果还存在剩余的空格,则用 -1填充。
返回生成的矩阵。

示例
  • 示例1

图1

输入:m = 3, n = 5, head = [3,0,2,6,8,1,7,9,4,2,5,5,0]
输出:[[3,0,2,6,8],[5,0,-1,-1,1],[5,2,4,9,7]]
解释:上图展示了链表中的整数在矩阵中是如何排布的。
注意,矩阵中剩下的空格用 -1 填充。
  • 示例2

图2

输入:m = 1, n = 4, head = [0,1,2]
输出:[[0,1,2,-1]]
解释:上图展示了链表中的整数在矩阵中是如何从左到右排布的。 
注意,矩阵中剩下的空格用 -1 填充。
提示
·1 <= m, n <= 10^5
·1 <= m * n <= 10^5
·链表中节点数目在范围 [1, m * n] 内
·0 <= Node.val <= 1000

2.题目解答

方法一:优化版
public class Solution {
    public int[][] spiralMatrix(int m, int n, ListNode head) {
        int[][] result = new int[m][n];
        for (int[] r : result) {
            Arrays.fill(r, -1);
        }
        int row = 0;
        int col = 0;
        int direction = 0;
        int[][] moveToWhere = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        ListNode p = head;

        while (p != null) {
            result[row][col] = p.val;
            p = p.next;
            // 判断是否需要转向
            int rowX = row + moveToWhere[direction][0];
            int colY = col + moveToWhere[direction][1];
            if (rowX < 0 || colY < 0 || rowX >= m || colY >= n || result[rowX][colY] != -1) {
                direction = (direction + 1) % 4;
                rowX = row + moveToWhere[direction][0];
                colY = col + moveToWhere[direction][1];
            }
            row = rowX;
            col = colY;
        }

        return result;
    }
}
方法二:详细版

解题思路
1.注意初始 right = n - 1bottom = m - 1,不要弄反了!

public class Solution {
    public int[][] spiralMatrix(int m, int n, ListNode head) {
        int[][] result = new int[m][n];
        for (int[] r : result) {
            Arrays.fill(r, -1);
        }
        int left = 0;
        int right = n - 1;
        int top = 0;
        int bottom = m - 1;
        ListNode p = head;

        while (p != null) {
            // 上侧从左到右
            for (int i = left; i <= right && p != null; i++) {
                result[top][i] = p.val;
                p = p.next;
            }
            top++;

            // 右侧从上到下
            for (int i = top; i <= bottom && p != null; i++) {
                result[i][right] = p.val;
                p = p.next;
            }
            right--;

            // 底侧从右到左
            for (int i = right; i >= left && p != null; i--) {
                result[bottom][i] = p.val;
                p = p.next;
            }
            bottom--;

            // 左侧从下到上
            for (int i = bottom; i >= top && p != null; i--) {
                result[i][left] = p.val;
                p = p.next;
            }
            left++;
        }

        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值