Ray Lee | 李宗叡
Learn or Die
Published in
2 min readDec 10, 2022

--

示意圖:

思路:

這題也是卡了我很久。

初次接觸這種題型, 我覺得可以先把圖畫出來, 先定義一下邏輯該怎麼走, 再來思考該怎麼實作 可參考上圖, 不同顏色代表不同的方向, 以及每次 insert 的範圍。

由上圖可以得到一些資訊

(1) 第一層的 offset 為 1

(2) 第二層開始, 每層的 offset 固定為 2

(3) 若 $n / 2 !== 0, 則會有中間單獨一個數字存在, 其位置為 $res[floor($n / 2)][floor($n / 2)]

(4) 可以看到, 輸出會是 [$n 個 array]

(5) 共有 $n 層

有了上面歸納出的規則, 我們就可以開始實作, 具體參考代碼

由於需要 insert $n 的二次方個數, 所以時間複雜度會是 O(n 的平方)

class Solution {

/**
* @param Integer $n
* @return Integer[][]
*/
function generateMatrix($n) {
$res = array_fill(0, $n, array_fill(0, $n, 0));
$loop = $mid = (int) ($n / 2);
$x = $y = 0;
$offset = 1;
$count = 1;

while ($loop > 0) {
$i = $x;
$j = $y;

for (; $i < $x + $n - $offset; $i++) {
$res[$j][$i] = $count++;
}

for (; $j < $y + $n - $offset; $j++) {
$res[$j][$i] = $count++;
}

for (; $i > $x; $i--) {
$res[$j][$i] = $count++;
}

for (; $j > $y; $j--) {
$res[$j][$i] = $count++;
}

$loop--;
$x++;
$y++;
$offset+=2;
}

if ($n%2 !== 0) {
$res[$mid][$mid] = $count;
}

return $res;
}
}

--

--

Ray Lee | 李宗叡
Learn or Die

It's Ray. I do both backend and frontend, but more focus on backend. I like coding, and would like to see the whole picture of a product.