59. Spiral Matrix II(python+cpp)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21275321/article/details/84112181

题目:

Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

Example:

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

解释:
把1到n2的数字按照顺序顺时针填入数组中,遍历数组的方式和54. Spiral Matrix(python+cpp)是一样的,维持一个变量作为当前填入的值,每次填入以后+1。
python代码:

class Solution(object):
    def generateMatrix(self, n):
        """
        :type n: int
        :rtype: List[List[int]]
        """
        self.matrix=[[0]*n for _ in xrange(n)]
        self.num=1;
        def changeInCircle(start):
            endX=n-1-start
            endY=n-1-start
            #从左到右改变一行
            for i in xrange(start,endX+1):
                self.matrix[start][i]=self.num;
                self.num+=1;
            #从上到下改变一列
            for i in xrange(start+1,endY+1):
                self.matrix[i][endX]=self.num;
                self.num+=1;
            #从右到左打印一行
            for i in xrange(endX-1,start-1,-1):
                self.matrix[endY][i]=self.num;
                self.num+=1;
            #从下到上打印一列:
            for i in xrange(endY-1,start,-1):
                self.matrix[i][start]=self.num;
                self.num+=1;
        start=0
        while n>start*2:
            changeInCircle(start)
            start+=1
        return self.matrix

c++代码:

class Solution {
public:
    int global_n;
    int num=1;
    vector<vector<int> > matrix;
    vector<vector<int> > generateMatrix(int n) {
        global_n=n;
        matrix=vector<vector<int> >(n,vector<int>(n,0));
        int start=0;
        while(start*2<n)
        {
            changeInCircle(start,matrix);
            start++;
        }
        return matrix;
    }
    void changeInCircle(int start,vector<vector<int> >&matrix)
    {
        int endX=global_n-1-start;
        int endY=endX;
        //从左到右遍历一行
        for (int i=start;i<=endX;i++)
        {
            matrix[start][i]=num;
            num++; 
        }
        //从上到下遍历一列(其实不需要判断了)      
        for(int i=start+1;i<=endY;i++)
        {
            matrix[i][endX]=num;
            num++;
        }
        //从右到左遍历一行
    
        for(int i=endX-1;i>=start;i--)
        {
            matrix[endY][i]=num;
            num++;
        }    
        //从下到上遍历一列
     
        for(int i=endY-1;i>start;i--)
        {
            matrix[i][start]=num;
            num++;
        }  
    }
};

总结:
由于是方阵,所以不需要太多判断。
I中还是需要判断的。

猜你喜欢

转载自blog.csdn.net/qq_21275321/article/details/84112181