Leetcode 48. 旋转图像(中等) 54. 螺旋矩阵(中等) 59. 螺旋矩阵 II(中等) 旋转遍历二维数组

labuladong

48. 旋转图像(中等)

题目:

 

 原地将二维矩阵顺时针旋转90度

思路:

先按左上至右下对角线对折,再将每一行调转

 

 

 

 

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n=matrix.size();
        //按左上-右下对角线翻转
        for(int i=0;i<n;++i){
            for(int j=i;j<n;++j){
                swap(matrix[i][j],matrix[j][i]);
            }
        }
        //对每一行反转
        for(int i=0;i<n;++i){
            int l=0;
            int r=n-1;
            while(l<r){
                swap(matrix[i][l],matrix[i][r]);
                l++;
                r--;
            }
        }

    }
};

同理,逆时针旋转90度的话

// 将二维矩阵原地逆时针旋转 90 度
void rotate2(int[][] matrix) {
    int n = matrix.length;
    // 沿左下到右上的对角线镜像对称二维矩阵
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            // swap(matrix[i][j], matrix[n-j-1][n-i-1])
            int temp = matrix[i][j];
            matrix[i][j] = matrix[n - j - 1][n - i - 1];
            matrix[n - j - 1][n - i - 1] = temp;
        }
    }
    // 然后反转二维矩阵的每一行
    for (int[] row : matrix) {
        reverse(row);
    }
}

void reverse(int[] arr) { /* 见上文 */}

 

54. 螺旋矩阵(中等)

题目:

 

 按照顺时针的顺序读取二维数组

思路:

 

 随着螺旋遍历,相应的边界会收缩,直到螺旋遍历完整个数组。注意while循环结束条件为ret.size<m*n

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();
        int up=0,bottom=m-1;
        int left=0,right=n-1;
        vector<int> ret;
        while(ret.size()<m*n){
            if(up<=bottom){
                for(int i=left;i<=right;++i){
                    ret.push_back(matrix[up][i]);
                }
                up++;
            }
            if(right>=left){
                for(int j=up;j<=bottom;++j){
                    ret.push_back(matrix[j][right]);
                }
                right--;
            }
            if(bottom>=up){
                for(int i=right;i>=left;--i){
                    ret.push_back(matrix[bottom][i]);
                }
                bottom--;
            }
            if(left<=right){
                for(int j=bottom;j>=up;--j){
                    ret.push_back(matrix[j][left]);
                }
                left++;
            }
        }
        return ret;
    }
};

 

59. 螺旋矩阵 II(中等)

题目:

 

 按照螺旋的顺序生成矩阵

思路:

同理遍历,注意结束条件为num<=n*n

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> ret(n,vector<int>(n));
        int up=0,bottom=n-1;
        int left=0,right=n-1;
        int num=1;
        while(num<=n*n){
            if(up<=bottom){
                for(int j=left;j<=right;++j){
                    ret[up][j]=num++;
                }
                up++;
            }
            if(right>=left){
                for(int i=up;i<=bottom;++i){
                    ret[i][right]=num++;
                }
                right--;
            }
            if(bottom>=up){
                for(int j=right;j>=left;--j){
                    ret[bottom][j]=num++;
                }
                bottom--;
            }
            if(left<=right){
                for(int i=bottom;i>=up;--i){
                    ret[i][left]=num++;
                }
                left++;
            }
        }
        return ret;
    }
};

 

posted @ 2022-02-26 20:00  鸭子船长  阅读(39)  评论(0编辑  收藏  举报