劍指offer 19、順時針列印矩陣 python c++
阿新 • • 發佈:2021-06-10
題目描述
輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下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; } };