2019-12-25 吴亲库里 库里的深夜食堂
旋转图像。二维矩阵表示一个图像。顺时针90度旋转图像。注意只能原地修改值,不能重新创建一个二维矩阵。

常规一种思路就是先转置二维矩阵,就像下面这样
[ [
[1,2,3], [1,4,7],
[4,5,6], 转置后 [2,5,8],
[7,8,9], [3,6,9],
] ]
然后再将每一行翻转一下即可。
/**
* @param Integer[][] $matrix
* @return NULL
*/
function rotate(&$matrix)
{
$n = count($matrix);
for ($i = 0; $i < $n; $i++) {
for ($j = $i; $j < $n; $j++) {
$temp = $matrix[$j][$i];
$matrix[$j][$i] = $matrix[$i][$j];
$matrix[$i][$j] = $temp;
}
}
for ($i = 0; $i < $n; $i++) {
for ($j = 0; $j < $n / 2; $j++) {
$temp = $matrix[$i][$j];
$matrix[$i][$j] = $matrix[$i][$n - $j - 1];
$matrix[$i][$n - $j - 1] = $temp;
}
}
return $matrix;
}
还有一种更秒的解法。你可以发现1最终到了3,3到了9,9到7,7到1,四个边角的移动,然后是向里缩进,继续里边的四个边角的交换。发现了这个规律,其实每次相当于四个位置值的交换。
/**
* @param Integer[][] $matrix
* @return NULL
*/
function rotate(&$matrix)
{
$n = count($matrix);
for ($i = 0; $i < $n / 2; $i++) {
for ($j = $i; $j < $n - $i - 1; $j++) {
$temp = $matrix[$n - 1 - $j][$i];
$matrix[$n - 1 - $j][$i] = $matrix[$n - 1 - $i][$n - 1 - $j];
$matrix[$n - 1 - $i][$n - 1 - $j] = $matrix[$j][$n - 1 - $i];
$matrix[$j][$n - 1 - $i] = $matrix[$i][$j];
$matrix[$i][$j] = $temp;
}
}
return $matrix;
}
