题目一:Spiral Matrix
Given a matrix of m*n elements (m rows, n columns), return all elements of the matrix in spiral order.
思路:本题目要求螺旋的方式从最外层读到最里层。注意这里是一般矩阵,不是方针,所有要小心最里层重复读的情况。即避免从右到左和从左到右读一样的,从下到上和从上到下读一样的。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
int m=matrix.size();
if(m==0) return res;
int n=matrix[0].size();
//特殊情况处理
if(m==1 || n==1){
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
res.push_back(matrix[i][j]);
return res;
}
//一般情况
int loops=min(m,n);
if(loops%2==1) loops=loops/2+1; //对层次的处理!
else loops=loops/2;
int i;
for(int lev=0; lev<loops; lev++){
for(i=lev; i<n; i++) //从左到右读到头
res.push_back(matrix[lev][i]);
for(i=lev+1; i<m; i++) //从上到下读到头
res.push_back(matrix[i][n-1]);
if(lev<m-1)
for(i=n-2; i>=lev; i--) //从右到左读到头
res.push_back(matrix[m-1][i]);
if(lev<n-1)
for(i=m-2; i>lev; i--) //从下到上
res.push_back(matrix[i][lev]);
m--;
n--;
}
return res;
}
};
题目二: Spiral Matrix II
Given an integer n, generate a square matrix filled with elements from 1 to n^2 in spiral order.
思路:这里是方针,n即为层数。
class Solution {
public:
vector<vector<int> > generateMatrix(int n) {
vector<vector<int> > res;
if(n==0) return res;
res.resize(n);
for(int i=0; i<n; i++)
res[i].resize(n);
//特殊情况出去(不到一圈)
if(n==1){
res[0][0]=1;
return res;
}
//一圈或者大于一圈
int cnt=1;
int loop=n/2;
if(n&1) loop=loop+1;
for(int lev=0; lev<loop; lev++){
for(int i=lev; i<n; i++) //从左到右到头
res[lev][i]=cnt++;
for(int i=lev+1; i<n; i++) //从上到下到头
res[i][n-1]=cnt++;
for(int i=n-2; i>=lev; i--) //从右到左到头
res[n-1][i]=cnt++;
for(int i=n-2; i>lev; i--) //从下到上
res[i][lev]=cnt++;
n--;
}
}
};
题目三: Rotate Image
You are given an n*n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place?
思路:分析规律。因为是in-place算法而且又要改变matrix的样子,故需要事先保存一些必要的量。
class Solution {
public:
void rotate(vector<vector<int> > &matrix) {
int n=matrix.size();
for(int lev=0; lev<n/2; lev++){ //这里为方针,故level数为n/2
int first=lev;
int last=n-1-lev;
for(int i=lev; i<last; i++){
int top=matrix[lev][i]; //保存最开始的位置
int offset=i-lev;
matrix[lev][i]=matrix[last-offset][lev]; //从左到上
matrix[last-offset][lev]=matrix[last][last-offset]; //从下到左
matrix[last][last-offset]=matrix[i][last]; //从右到下
matrix[i][last]=top;
}
}
}
};