题目链接:2326. 螺旋矩阵 IV
Ideas
算法:边界压缩
数据结构:链表
思路:印象中好像刚开始学算法的时候就遇到过类似的题目,什么旋转打印矩阵之类的,跟这道题类似。
- 首先创建一个 m * n 的矩阵,默认用 -1 填充即可;
- 定义up、down、left、right四个变量,分别表示矩阵的四个边界;
- 遍历链表往矩阵里面填数,完成一行或一列之后就压缩对应的边界,行和列遍历的顺序就是顺时针遍历。
Code
C++
class Solution {
public:
vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) {
vector<vector<int>> res(m, vector<int>(n, -1));
int up = 0, down = m - 1, left = 0, right = n - 1;
while (head) {
// 1.从左向右,行不变列变
for (int i = left; i < right + 1; i++) {
res[up][i] = head->val;
head = head->next;
if (head == nullptr) return res;
}
if (up < down) up++;
// 2.从上到下,列不变行变
for (int i = up; i < down + 1; i++) {
res[i][right] = head->val;
head = head->next;
if (head == nullptr) return res;
}
if (left < right) right--;
// 3.从右向左,行不变列变
for (int i = right; i > left - 1; i--) {
res[down][i] = head->val;
head = head->next;
if (head == nullptr) return res;
}
if (up < down) down--;
// 4.从下到上,列不变行变
for (int i = down; i > up - 1; i--) {
res[i][left] = head->val;
head = head->next;
if (head == nullptr) return res;
}
if (left < right) left++;
}
return res;
}
};