龙空技术网

「LeetCode第300场周赛题解笔记」6111. 螺旋矩阵 IV

草木芃芃 82

前言:

眼前我们对“螺旋矩阵c语言顺时针”大概比较讲究,各位老铁们都想要分析一些“螺旋矩阵c语言顺时针”的相关知识。那么小编在网摘上搜集了一些有关“螺旋矩阵c语言顺时针””的相关资讯,希望姐妹们能喜欢,你们快快来学习一下吧!

6111. 螺旋矩阵 IV题目(中等)

给你两个整数:mn ,表示矩阵的维数。

另给你一个整数链表的头节点 head

请你生成一个大小为 m x n 的螺旋矩阵,矩阵包含链表中的所有整数。链表中的整数从矩阵 左上角 开始、顺时针螺旋 顺序填充。如果还存在剩余的空格,则用 -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:

 输入:m = 1, n = 4, head = [0,1,2] 输出:[[0,1,2,-1]] 解释:上图展示了链表中的整数在矩阵中是如何从左到右排布的。  注意,矩阵中剩下的空格用 -1 填充。

提示:

1 <= m, n <= 1051 <= m * n <= 105链表中节点数目在范围 [1, m * n]0 <= Node.val <= 1000解题思路方法一:模拟(按层模拟)

将螺旋矩阵看成由若干层组成的,一层层填充空格,直至填到最内层。

定义每层左上角空格为 (top, left)、右下角为 (bottom, right),按上图所示,顺时针一段段的填充矩阵:

(top, left)(top, right)(top + 1, right)(bottom, right)bottom > top 时,(bottom, right - 1)(bottom, left),即 bottomtop 不是在一行left < right 时,(bottom, left)(top + 1, left),即leftright 不是在一列

填充完当前层后,lefttop 增加一,rightbottom 减少一,进入下一层继续填充,直至填完。

复杂度分析时间复杂度:O(mn)。空间复杂度:O(mn)。方法二:模拟

按照题意直接模拟,首先将矩阵全部填充为 -1,然后沿向左方向开始填充矩阵,当填充到矩阵边界或者已经填充的格子时,则改变方向继续填充。填充方向设置为向左、向下、向右、向上,每当填充到边界或已填充的格子时,就改变方向,直至链表中的元素填充完毕。

复杂度分析时间复杂度:O(mn)。空间复杂度:O(mn)。代码

 /**  * Definition for singly-linked list.  * public class ListNode {  *     int val;  *     ListNode next;  *     ListNode() {}  *     ListNode(int val) { this.val = val; }  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }  * }  */ class Solution {     public int[][] spiralMatrix(int m, int n, ListNode head) {         int[][] ans = new int[m][n];         int t = 0, l = 0, b = m - 1, r = n - 1;         while (t <= b && l <= r) {             for (int j = l; j <= r; j++) {                 ans[t][j] = head == null ? -1 : head.val;                 if (head != null) head = head.next;             }             t++;             for (int i = t; i <= b; i++) {                 ans[i][r] = head == null ? -1 : head.val;                 if (head != null) head = head.next;             }             r--;             if (b > t) {                 for (int j = r; j >= l; j--) {                     ans[b][j] = head == null ? -1 : head.val;                     if (head != null) head = head.next;                 }                 b--;             }             if (l < r) {                 for (int i = b; i >= t; i--) {                     ans[i][l] = head == null ? -1 : head.val;                     if (head != null) head = head.next;                 }                 l++;             }         }         return ans;     } }
 /**  * Definition for singly-linked list.  * public class ListNode {  *     int val;  *     ListNode next;  *     ListNode() {}  *     ListNode(int val) { this.val = val; }  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }  * }  */ class Solution {     public int[][] spiralMatrix(int m, int n, ListNode head) {         // 初始化答案矩阵值为-1         int[][] ans = new int[m][n];         for (int i = 0; i < m; i++) {             Arrays.fill(ans[i], -1);         }         // 顺时针填充矩阵         int[] dx = {0, 1, 0, -1};         int[] dy = {1, 0, -1, 0};         int x = 0, y = 0, d = 0;         while (true) {             ans[x][y] = head.val;             head = head.next;             // 链表已经遍历完,退出             if (head == null) {                 break;             }             // 计算下一个位置坐标             while (true) {                 // 尝试往前走一步                 int nx = x + dx[d];                 int ny = y + dy[d];                 // 走出矩阵或走到已填充位置,换一个方向                 if (nx < 0 || ny < 0 || nx >= m || ny >= n || ans[nx][ny] != -1) {                     d = (d + 1) % 4;                     continue;                 }                 // 走到下一个要填充位置                 x = nx;                 y = ny;                 break;             }         }         return ans;     } }

题目链接:

标签: #螺旋矩阵c语言顺时针