leetcode 48.旋转图像 54.螺旋矩阵 59.螺旋矩阵||

48.旋转图像

给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

给定 matrix = 
[
[1,2,3],
[4,5,6],
[7,8,9]
],	
原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
 [9,6,3]
]

这个题目在左神的算法课里有讲过。
思想:宏观的考虑数据的变动。给定矩阵,考虑一层一层变换。对于一层,给定左上角点和右下角点,对于一个点,就会有相应的四个点,数字进行交换。 如果陷入坐标变换,就会十分麻烦。
在这里插入图片描述
问题延伸:转圈打印矩阵,之字形打印矩阵。(不拘泥于坐标,而是考虑整体、宏观的变换。
延伸问题阅读

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int len = matrix[0].size();
        for(int i=0; i<len;i++){
            pt(matrix,i,len-1-i);
        }
    }

    void pt(vector<vector<int>>& matrix, int posup, int posdown){
        int temp; 
        for(int i =0; i<posdown-posup;i++){
            temp =matrix[posup][posup+i];
            matrix[posup][posup+i] = matrix[posdown-i][posup] ;
            matrix[posdown-i][posup] =matrix[posdown][posdown-i];
            matrix[posdown][posdown-i] = matrix[posup+i][posdown];
            matrix[posup+i][posdown] = temp;         
        }
    }
};

54.螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

思路: 也是要总结宏观的规律,给定左上角和右下角点,顺序输出一圈的元素。注意最中心只有一行或者一列要特殊讨论
在这里插入图片描述
代码

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> sb;
        if(matrix.size()==0) return sb;
        int i=0;
        int x=matrix.size()-1;
        int y=matrix[0].size()-1;
        while(i<=x && i<=y){
            pt(matrix,i,i,x,y,sb);
            i++;
            x--;
            y--;
        }
        return sb;
    }

    void pt(vector<vector<int>>& matrix, int leftx,int lefty, int rightx, int righty,vector<int>& sb){        
        int i=leftx;
        int j=lefty;
        if (leftx==rightx && lefty ==righty) {
            sb.push_back(matrix[leftx][leftx]);
            return;}
        if(leftx==rightx){
            while(j<=righty){
                sb.push_back(matrix[leftx][j]);
                j++;                
            }
            return;
        }
        if(righty==lefty){
            while(i<=rightx){
                sb.push_back(matrix[i][lefty]);
                i++;
                
            }
            return;
        }
        while(j<righty){
            sb.push_back(matrix[i][j]);
            j++;
        }
        while(i<rightx){
            sb.push_back(matrix[i][j]);
            i++;
        } 
        while(j>lefty ){
            sb.push_back(matrix[i][j]);
            j--;
        }
        while(i>leftx){
            sb.push_back(matrix[i][j]);
            i--;
        }
    }
};

59.螺旋矩阵ll

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

思路:同样是要宏观地表达。给定左上角点和右下角点,可以确定一圈的数字。 定义一个函数用来填数字,并且返回填入的数字,让下一圈继续这个数字填。
注意: vector矩阵在初始化的时候要确定大小。vector<vector> sb(n,vector(n,0));

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int num=1;
        int i=0;
        int j=n-1;
        vector<vector<int>> sb(n,vector<int>(n));
        while(i<=j){
            num = pr(sb,i++,j--,num);
        }
        return sb;
    }

    int pr(vector<vector<int>> &sb,int left,int right,int num){
        if(left==right){
            sb[left][left]=num++;
            return num;
        }
        int i=left;
        int j=left;
        while(i<right){
            sb[j][i++] = num++;
        }
        while(j<right){
            sb[j++][i] = num++;
        }
        while(i>left){
            sb[j][i--]=num++;
        }
        while(j>left){
            sb[j--][i]=num++;
        }
        return num;
    }
};
发布了61 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/surserrr/article/details/103748546