题解 | #顺时针旋转矩阵#

顺时针旋转矩阵

https://www.nowcoder.com/practice/2e95333fbdd4451395066957e24909cc

void ClockwiseMoseACircle(vector<vector<int> >& mat, int n, int start);
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param mat int整型vector<vector<>> 
     * @param n int整型 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > rotateMatrix(vector<vector<int> >& mat, int n) {
        // write code here
        //总共需要旋转多少圈
        int leftn = n;
        int start = 0;
        while(leftn>0)
        {
            for(int i=0; i<leftn-1; i++)
            {
                ClockwiseMoseACircle(mat, n, start);
            }
            leftn -= 2;
            start++;
        }
        return mat;
    }
};


//一些案例
/*
1--->1
1 2        3 1
3 4 --->   4 2

1 2 3       4 1 2
4 5 6       7 5 3
7 8 9 --->  8 9 6

1 2 3 4         13 9 5 1
5 6 7 8         14
9 10 11 12
13 14 15 16 -->
*/

//思路:先搞出来一圈,将一圈逆时针地置数 
//start = 0; endX=n-1-start; endY=n-1-start;

void ClockwiseMoseACircle(vector<vector<int> >& mat, int n, int start)
{
    int end = n-1-start;

    if(start == end)
    {
        return;
    }
    int leave = mat[start][start];
    //第一步:对于start 所在的列
    for(int i=start; i<end; i++)
    {
        mat[i][start] = mat[i+1][start];
    }

    //第二步:对于end所在的行
    for(int i=start; i<end; i++)
    {
        mat[end][i] = mat[end][i+1];
    }

    //第三步:对于end所在的列
    for(int i=end; i>start; i--)
    {
        mat[i][end] = mat[i-1][end];
    }

    //第四步:对于start 所在的行
    for(int i=end; i>start; i--)
    {
        if(i==start+1)
        {
            mat[start][i] = leave;
        }
        else {
            mat[start][i] = mat[start][i-1];
        }
    }

}

全部评论

相关推荐

码农索隆:我头回见校招简历把个人优势写在最前面的,是我老了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务