59.螺旋矩陣II
給你一個(gè)正整數(shù) n
印蔗,生成一個(gè)包含 1
到 n^2^
所有元素,且元素按順時(shí)針順序螺旋排列的 n x n
正方形矩陣 matrix
席楚。
示例 1:
輸入:n = 3
輸出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
輸入:n = 1
輸出:[[1]]
提示:
1 <= n <= 20
思路:
本題總體而言沒(méi)有什么特定的算法胧瓜,算是對(duì)于二維數(shù)組的一次運(yùn)用垒探,關(guān)鍵點(diǎn)就是要不重不漏地進(jìn)行遍歷賦值眉撵。
代碼:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定義一個(gè)二維數(shù)組
int startx = 0, starty = 0; // 定義每循環(huán)一個(gè)圈的起始位置
int loop = n / 2; // 每個(gè)圈循環(huán)的次數(shù)
int mid = n / 2; // 矩陣中間的位置,用于處理n為奇數(shù)時(shí)的情況
int count = 1; // 用來(lái)給矩陣中每一個(gè)空格賦值把敞,從1開(kāi)始
int offset = 1; //每次循環(huán)縮小邊界
int i, j;//用于進(jìn)行循環(huán)
while (loop--) { //進(jìn)行l(wèi)oop次循環(huán)
i = startx;
j = starty;
// 填充上行從左到右(左閉右開(kāi))
for (j = starty; j < n - offset; j++) {
res[startx][j] = count++;
}
// 填充右列從上到下(左閉右開(kāi))
for (i = startx; i < n - offset; i++) {
res[i][j] = count++;
}
// 填充下行從右到左(左閉右開(kāi))
for (; j > starty; j--) {
res[i][j] = count++;
}
// 模擬填充左列從下到上(左閉右開(kāi))
for (; i > startx; i--) {
res[i][j] = count++;
}
// 第二圈開(kāi)始的時(shí)候弥奸,起始位置要各自加1
startx++;
starty++;
// offset 控制每一圈里每一條邊遍歷的長(zhǎng)度
offset += 1;
}
// 如果n為奇數(shù)的話(huà),需要單獨(dú)給矩陣最中間的位置賦值
if (n % 2) {
res[mid][mid] = count;
}
return res;
}
};
為了做到不重不漏奋早,就要整體都按照一定的順序進(jìn)行賦值盛霎。這里就用到了統(tǒng)一使用左閉右開(kāi)區(qū)間的思想,每一輪賦值時(shí)統(tǒng)一給左邊界賦值耽装,右邊界不賦值愤炸。
參考教程:一入循環(huán)深似海 | LeetCode:59.螺旋矩陣II_嗶哩嗶哩_bilibili
往期回顧:
LeetCode977.有序數(shù)組的平方
LeetCode844.比較含退格的字符串
LeetCode283.移動(dòng)零
LeetCode27.移除元素
LeetCode26.刪除有序數(shù)組中的重復(fù)項(xiàng)
LeetCode209.長(zhǎng)度最小的子數(shù)組
LeetCode904. 水果成籃
LeetCode242.有效的字母異位詞
LeetCode76.最小覆蓋子串