zoukankan      html  css  js  c++  java
  • Leetcode顺时钟旋转90度

    问题
    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. 对角交换+以中间线左右交换


    观察交换前后数组关系,发现:
    原数组第一行变成新数组最右边一列
    原数组第二行变成新数组最右边第二列
    ……

    那么代码就简单,见最后附录代码。

    2. 四元组为单位旋转

    分析数组,发现规律:
    a[i][j] = a[n-1-j][i](左边指旋转后元素)



    使用快捷键:
    对于数组,终止条件为:
    i<n/2
    j>=i && j<n-i-1

    源代码
    /* Copright Reserved by MiracleCoder
    * No permit to delete the link: http://blog.csdn.net/idc_void
    */
    #define N 4
    void PrintMatrix( int m[N][N], const char *str )
    {
    cout << str << endl;
    for ( int i = 0; i < N; ++i )
    {
    for ( int j = 0; j < N; ++j )
    {
    cout << m[i][j] << " ";
    }
    cout << endl;
    }
    }
    void Rotate( int matrix[N][N])
    {
    if( matrix == NULL )
    return;
    // print
    PrintMatrix( matrix, "Before");
    for ( int i = 0; i < N; ++i )
    {
    for ( int j = 0; j < i; ++j ) // Condition: j < i
    swap( matrix[i][j], matrix[j][i]);
    }
    for ( int i = 0; i < N; ++i )
    {
    for ( int j = 0; j < N/2; ++j ) // 次数确定:每次减两个,直到只剩下一个或者零个
    swap( matrix[i][j] , matrix[i][N-j-1] );
    }
    // print
    PrintMatrix( matrix, "After rotate 90 degree ");
    }
    void Rotate90Degree( int matrix[N][N] )
    {
    // print
    PrintMatrix( matrix, "Before");
    for ( int i = 0; i < N/2; ++i )
    {
    for( int j = i; j < N - 1 - i; ++j ){
    int value = matrix[i][j];
    matrix[i][j] = matrix[N-1-j][i];
    matrix[N-1-j][i] = matrix[N-i-1][N-1-j];
    matrix[N-i-1][N-1-j] = matrix[j][N-i-1];
    matrix[j][N-i-1] = value;
    }
    }
    PrintMatrix( matrix, "After rotate 90 degree ");
    }

  • 相关阅读:
    linux-shell编程-1-简介
    linux-tail
    linux-grep
    linux-sort
    linux-sed
    linux-awk
    函数调用
    选择结构和循环结构
    列表字典集合常用函数
    datetime模块
  • 原文地址:https://www.cnblogs.com/miraclecoder/p/4051170.html
Copyright © 2011-2022 走看看