Leetcode 54. 螺旋矩阵(C、C++、python)

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

C

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* spiralOrder(int** matrix, int matrixRowSize, int matrixColSize) 
{
    int m=matrixRowSize;
    int n=matrixColSize;
    int su=m*n;
    int* res=(int*)malloc(sizeof(int)*su);
    int cc=0;
    int k=0;
    int count=(m+1)/2;
    while(k<count && cc<su)
    {
        for(int i=k;i<n-k;i++)
        {
            res[cc]=matrix[k][i];
            cc++;
        }
        for(int i=k+1;i<m-1-k;i++)
        {
            res[cc]=matrix[i][n-1-k];
            cc++;
        }
        if(k!=m-1-k)
        {
            for(int i=k;i<n-k;i++)
            {
                res[cc]=matrix[m-1-k][n-1-i];
                cc++;
            }
        }
        if(k!=n-1-k)
        {
            for(int i=k+1;i<m-1-k;i++)
            {
                res[cc]=matrix[m-1-i][k];
                cc++;
            }
        }
        k++;       
    }
    return res;
}

C++

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        vector<int> res;
        if(matrix.empty() || matrix[0].empty())
        {
            return res;
        }
        int m=matrix.size();          
        int n=matrix[0].size();
        int su=m*n;
        int count=(m+1)/2;
        int k=0;
        int cc=0;
        while(k<count && cc<su)
        {
            for(int i=k;i<n-k;i++)
            {
                res.push_back(matrix[k][i]);
                cc++;
            }
            for(int i=k+1;i<m-1-k;i++)
            {
                res.push_back(matrix[i][n-1-k]);
                cc++;
            }
            if(k!=m-1-k)
            {
                for(int i=k;i<n-k;i++)
                {
                    res.push_back(matrix[m-1-k][n-1-i]);
                    cc++;
                }
            }    
            if(k!=n-1-k)
            {
                for(int i=k+1;i<m-1-k;i++)
                {
                    res.push_back(matrix[m-1-i][k]);
                    cc++;
                }
            }            
            k++;
        }
        return res;
    }
};

C++ 法2

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        vector<int> res;
        if(0==matrix.size()  || 0==matrix[0].size())
        {
            return res;
        }
        int m=matrix.size();
        int n=matrix[0].size();
        int r=0,c=0;
        while(m>=2 && n>=2)
        {
            for(int j=c;j<n+c;j++)
            {
                res.push_back(matrix[r][j]);
            }
            for(int i=r+1;i<m+r-1;i++)
            {
                res.push_back(matrix[i][c+n-1]);
            }
            for(int j=c+n-1;j>=c;j--)
            {
                res.push_back(matrix[r+m-1][j]);
            }
            for(int i=r+m-2;i>r;i--)
            {
                res.push_back(matrix[i][c]);
            }
            r++;
            c++;
            m-=2;
            n-=2;
        }
        if(m>0 && n>0)
        {
            if(m>n)
            {
                for(int i=r;i<r+m;i++)
                {
                    res.push_back(matrix[i][c]);
                }
            }
            else
            {
                for(int j=c;j<c+n;j++)
                {
                    res.push_back(matrix[r][j]);
                }
            }            
        }
        return res;
    }
};

 

python

class Solution:
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        res=[]
        m=len(matrix)
        if m==0:
            return res
        else:
            n=len(matrix[0])
            if n==0:
                return res
        count=(m+1)//2
        k=0
        su=m*n
        cc=0
        while k<count and cc<su:
            for i in range(k,n-k):
                res.append(matrix[k][i])
                cc+=1
            for i in range(k+1,m-1-k):
                res.append(matrix[i][n-1-k])
                cc+=1
            if k!=m-1-k:
                for i in range(k,n-k):
                    res.append(matrix[m-1-k][n-1-i])
                    cc+=1
            if k!=n-1-k:
                for i in range(k+1,m-1-k):
                    res.append(matrix[m-1-i][k])
                    cc+=1
            k+=1
        return res

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值