問題の説明
各ピクセルのサイズが4バイトのN×Nマトリックスで表される画像を提供します。画像を90度回転するアルゴリズムを設計してください。
追加のメモリスペースを占有することなく実行できますか?
問題解決レポート
回転プロセスをシミュレートすると、位置(i、j)の要素が90度回転して(j、n-1-i)になり、位置(j、n-1-i)の要素が90度回転して(n -1-i、n-1-j)、位置(n-1-i、n-1-j)の要素を90度回転して(n-1-j、i)と最終位置(n-1- j、i)の要素は(i、j)に回転されます。[要素が360度回転し、元の位置に戻ることを意味します]
したがって、左上隅の1/4の行列サイズを列挙し、トラバースされた要素とそれに関連する4つの要素の交換位置を調べるだけで済みます。
実装コード
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n=matrix.size();
for(int i=0;i<n/2;i++){
for(int j=0;j<(n+1)/2;j++){
int tmp=matrix[i][j];
matrix[i][j]=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]=tmp;
}
}
}
};
参考文献
[1] Leetcodeインタビューの質問01.07。回転行列
[2] [デイリーアルゴリズムDay93]追加スペースなしで行列を回転させますか?