1. 程式人生 > >54. Spiral Matrix(python+cpp)

54. Spiral Matrix(python+cpp)

題目:

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:

Input: 
[  
[ 1, 2, 3 ],  
[ 4, 5, 6 ],  
[ 7, 8, 9 ] 
] 
Output:[1,2,3,6,9,8,7,4,5] 

Example 2:

Input: 
[   
[1, 2, 3, 4],   
[5, 6, 7, 8],   
[9,10,11,12] 
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

解釋:
螺旋狀(順時針)遍歷矩陣,劍指offer原題。
需要注意的是,start一定是在主對角線上的,也就是x和y的start是一樣的。
python程式碼:

class Solution(object):
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        if not matrix:
            return []
        self.rows=len
(matrix) self.cols=len(matrix[0]) start=0 self.result=[] self.matrix=matrix def appendInCircle(start): endX=self.cols-1-start endY=self.rows-1-start #從左到右列印一行 for i in xrange(start,endX+1): self.result.
append(self.matrix[start][i]) #從上到下列印一列 if endY>start: for i in xrange(start+1,endY+1): self.result.append(self.matrix[i][endX]) #從右到左列印一行 if endY>start and endX>start: for i in xrange(endX-1,start-1,-1): self.result.append(self.matrix[endY][i]) #從下到上列印一列,三行兩列 if endX>start and endY-start>1: for i in xrange(endY-1,start,-1): self.result.append(self.matrix[i][start]) while self.cols>start*2 and self.rows>start*2: appendInCircle(start) start+=1 return self.result

c++程式碼:

class Solution {
public:
    vector <int> result;
    int row;
    int col;
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        row=matrix.size();
        if (row==0)
            return result;
        col=matrix[0].size();
        int start=0;
        while(2*start<row && 2*start<col)
        {
            appendInCircle(start,matrix);
            start++;
        }
       return result; 
        
    }
    void appendInCircle(int start,vector<vector<int>>& matrix)
    {
        int endX=col-1-start;
        int endY=row-1-start;
        //從左到右列印一行
        for(int i=start;i<=endX;i++)
            result.push_back(matrix[start][i]);
        //從上到下列印一列
        if (endY>start)
        {
            for(int i=start+1;i<=endY;i++)
                result.push_back(matrix[i][endX]);
        }
        //從右往左列印一行
        if(endY>start && endX>start)
        {
            for(int i=endX-1;i>=start;i--)
                result.push_back(matrix[endY][i]);
        }
        //從下往上列印一行
        if(endY-start>1 &&endX>start)
            for(int i=endY-1;i>start;i--)
                result.push_back(matrix[i][start]);
    }
};

總結: