2.1.15 Rotate Image
描述
You are given an n*n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up: Could you do this in-place?
分析
图像旋转90度
首先想到,纯模拟,从外到内一圈一圈的转,但这个方法太慢。
如下图,首先沿着副对角线翻转一次,然后沿着水平中线翻转一次。
图2-4 Rotate Image
或者,首先沿着水平中线翻转一次,然后沿着主对角线翻转一次。
function f(&$arr,$n)
{
if(false==is_array($arr)) return false;
for($i=0;$i<$n-1;++$i){
$temp=$arr[$i][$i];
$arr[$i][$i]=$arr[$n-$i-1][$n-$i-1];
$arr[$n-$i-1][$n-$i-1]=$temp;
}
$mid=intval($n/2);
for($i=0;$i<$mid;++$i){
for($j=0;$j<$n;$j++){
$temp=$arr[$i][$j];
$arr[$i][$j]=$arr[$n-$i-1][$j];
$arr[$n-$i-1][$j]=$temp;
}
}
}
function isExists($arr,$value,$n,$m)
{
if(false===is_array($arr)) return false;
$bn = 0;
$bm = $m - 1;
while ($bn >= $n || $bm >= 0) {
if ($arr[$bn][$bm] == $value) {
return true;
} else if ($arr[$bn][$bm] < $value) {
$bn++;
} else {
$bm--;
}
}
return false;
}
上面这样需要输入二维数组和行数和列数,可以使用下面输入一维数组
function isExists($arr,$value,$n,$m)
{
if(false===is_array($arr)) return false;
$bn = 0;
$bm = $m;
while ($bn<$n&&$bm >= 0) {
$temp=$arr[$bm+$bn*$m-1];
if ($temp== $value) {
return true;
} else if ($temp<$value) {
$bn++;
} else {
$bm--;
}
}
return false;
}