题目描述:

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise顺时针方向).

Follow up:
Could you do this in-place?

方法1:

最外圈到最里圈,一层一层的转。

代码:

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {

    	if(matrix.size()==0 || matrix[0].size()!=matrix.size())
    		return;

        int n=matrix.size();
        for(int i=0;i<n/2;i++)
        {
            for(int j=i;j<n-1-i;j++)
            {
                int temp=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]=temp;
            }
        }
    }
};

 

解法2:

把矩阵旋转90度是按照一定的规则把行变成列(把第一行变为最后一列,把第二行变为倒数第二列,把第三行变为倒数第三列。。。),而转置为:把第一行变为第一列,把第二行变为第二列,把第三行变为第三列,。。。可以发现把矩阵旋转90度和把矩阵转置这两种操作具有某种相似性。一次完成不了可以分步完成。先把原矩阵转置(矩阵转置也是按照一定的规则把行变成列,然后再把列调整成满足矩阵旋转90度的规则要求),然后沿Y轴对称(翻转列)就行了。

class Solution {
public:
    void rotate(vector<vector<int> > &matrix)
    {

    	if(matrix.size()==0 || matrix[0].size()!=matrix.size())
    		return;
    	int n = matrix.size();
        //先转置,公式:a[i][j] = a[j][i]
        for(int i=0;i<n;i++)//矩阵转置相当于沿着对角线翻转
        {   //操作不能做到重复
        	for(int j=i+1;j<n;j++)//上三角
        	{
        		int temp = matrix[i][j];
        		matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        //再沿着Y轴对称调整
        for(int j=0;j<n/2;j++)//n/2理解成长度
        {
        	for(int i=0;i<n;i++)
        	{
        		int temp = matrix[i][j];
        		matrix[i][j] = matrix[i][n-1-j];//利用位移不变性找坐标点
        		matrix[i][n-1-j] = temp;
            }
        }
    }

};

  

 

12-30 22:18