每日一练 · 螺旋矩阵 IV

149 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

一、题目描述:

给你两个整数:m 和 n ,表示矩阵的维数。

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

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

返回生成的矩阵。

 

示例 1:

image.png

输入: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:

image.png

输入: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;
	}
}


四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起!