题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路
用旋转魔法的方式,一直取出第一行;
例如
1 2 3
4 5 6
7 8 9
输出并删除第一行后,变为
4 5 6
7 8 9
再进行一次逆时针旋转,就变成:
6 9
5 8
4 7
继续重复上述操作即可。
python版
# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
# write code here
res=[]
while matrix:
res += matrix[0] #把第一行当做元素加到结果中
matrix = matrix[1:] #去掉第一行
matrix = self.turn(matrix) #矩阵逆时针旋转90度
return res
def turn(self,matrix):
new = []
if not matrix: #列表为空,返回空列表 加这句主要是为空时下面计算列数时的matrix[0]超出下标范围
return new
col = len(matrix[0])
for i in range(col-1,-1,-1): #从最后一列开始,注意col-1和 -1这两个
b = [j[i] for j in matrix] #取第i列元素
new.append(b)
return new
c++版
class Solution {
public:
vector<vector<int> > turn(vector<vector<int> > matrix){
vector<vector<int> > newMatrix;
if(matrix.size()==0){
return matrix;
}
int col = matrix[0].size();
int row = matrix.size();
for(int i=col-1;i>=0;--i){
vector<int> temp;
for(int j=0;j<row;++j){
temp.push_back(matrix[j][i]);
}
newMatrix.push_back(temp);
}
return newMatrix;
}
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> res;
while(matrix.size()!=0){
for(int i=0;i<matrix[0].size();++i){
res.push_back(matrix[0][i]);
}
matrix.erase(matrix.begin());
matrix = turn(matrix);
}
return res;
}
};
突然发现我这篇文章可能和这题有关系,应该有共同的地方,我明天试试。 旋转矩阵的构造和螺旋三角阵的构造
的的确确可以用上面链接的方法来弄,思路见上个链接。
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
int row = matrix.size(); //行
int col = matrix[0].size(); //列
int max = row*col; //元素数量
int l = 0, r = col - 1, u = 0, d = row - 1;
vector<int> res;
while (max > 0){
for (int i = l; (i <= r) && (max > 0); i++) { //加上(max > 0)是为了防止给的矩阵不是方阵的情况,
//如果都是方阵,那不加也行,因为方阵的情况下这四个for循环执行次数必然是相等的,不是方阵的情况就不同了
res.push_back(matrix[u][i]);
max--;
}
u++;
for (int i = u; (i <= d) && (max > 0); i++) {
res.push_back(matrix[i][r]);
max--;
}
r--;
for (int i = r; (i >= l) && (max > 0); i--) {
res.push_back(matrix[d][i]);
max--;
}
d--;
for (int i = d; (i >= u) && (max > 0); i--) {
res.push_back(matrix[i][l]);
max--;
}
l++;
}
return res;
}
};