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; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=