持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
一、题目描述:
给你两个整数:m 和 n ,表示矩阵的维数。
另给你一个整数链表的头节点 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 <= 105 1 <= m * n <= 105 链表中节点数目在范围 [1, m * n] 内 0 <= Node.val <= 1000
二、思路分析:
设计一个方向数组,用来位移
定义4个指针l,r,up,down,分别表示左右上下
从l-r变量一遍,up++; 从up-down变量一遍,r--; 从r-l变量一遍,up++; 从l-r变量一遍,l++;
越界则先将行r列减去方向数组,再down++,再加上down++后的方向数组,再进行判断,进行一个while循环,以此顺时针控制方向
如果改变了3次方向都越界说明到尾,因此需要再加上一个count计数用来跳出循环
三、AC 代码:
class Solution {
public int[][] spiralMatrix(int m, int n, ListNode head) {
int[][] ans = new int[m][n];
for (int i = 0; i < ans.length; i++) {
Arrays.fill(ans[i], -1);
}
int l = 0, r = n - 1, up = 0, down = m - 1, f = 0;
while (head != null) {
if (f == 0) {
for (int x = l; x <= r && head != null; x++) {// 左->右
ans[up][x] = head.val;
head = head.next;
}
up++;// 上指针++
f = 1;
} else if (f == 1) {// 上->下
for (int y = up; y <= down && head != null; y++) {
ans[y][r] = head.val;
head = head.next;
}
r--;// 右指针--
f = 2;
} else if (f == 2) {
for (int x = r; x >= l && head != null; x--) {// 右->左
ans[down][x] = head.val;
head = head.next;
}
down--;// 下指针--
f = 3;
} else {
for (int y = down; y >= up && head != null; y--) {// 下->上
ans[y][l] = head.val;
head = head.next;
}
f = 0;
l++;// 左指针++
}
}
return ans;
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起!