【LeetCode刷题】54.螺旋矩阵

目录

  • 题目:54.螺旋矩阵
    • 示例1:
    • 示例2:
    • 解题思路
    • 代码(Python)
    • 代码(C++)

题目:54.螺旋矩阵

给定一个包含 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]

解题思路

  1. 首先定义方向:向下表示y正方向,向右表示x正方向;
  2. 再定义两个点,分别是左上(x1,y1)和右下(x2,y2);
  3. 再把循环分为四个边区间进行,分别为:上方[x1,x2],右方[y1,y2],下方[x2,x1],左方[y2,y1];
  4. 每循环一圈(4次),矩阵的长宽都缩短1。

解释:
【LeetCode刷题】54.螺旋矩阵_第1张图片

代码(Python)

class Solution(object):
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        #存放结果
        result = list()
        if not matrix:
            return result
        #数组行,列数的长度
        row, col = len(matrix), len(matrix[0])  
        #定义矩阵的左上角坐标(x1,y1),右下角坐标(x2,y2)
        x1, y1, x2, y2 = 0, 0, col-1, rol-1
        while True:
            #从上左向上右遍历
            for i in range(x1, x2+1):
                result.append(matrix[y1][i])
            y1+=1
            #边界判断,矩阵高度不能为0
            if y1>y2:
                break
            #从右上向右下
            for j in range(y1, y2+1):
                result.append(matrix[j][x2])
            x2-=1
            if x1>x2:
                break
            #从下右向下左
            for m in range(x2, x1+1, -1):
                result.append(matrix[y2][m])
            y2-=1
            if x1>x2:
                break
            #从左下向左上
            for n in range(y2, y1+1, -1):
                result.append(matrix[n][x1])
            x1+=1
            if x1>x2:
                break
        return result

代码(C++)


class Solution {
     
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
     
        vector<int> res;
        int  y1 = 0,  y2 = matrix.size() - 1,  x1 = 0,  x2 = matrix[0].size() - 1;
        while (true) {
     
            for(int i= x1;i<= x2;i++)
               res.push_back(matrix[ y1][i]);

            if(++ y1> y2)
                break;
            
            for(int i= y1;i<= y2;i++)
                res.push_back(matrix[i][ x2]);

            if(-- x2< x1)
                break;
            
            for(int i= x2;i>= x1;i--)
                res.push_back(matrix[ y2][i]);

            if(-- y2< y1)
                break;
            
            for(int i= y2;i>= y1;i--)
                res.push_back(matrix[i][ x1]);

            if(++ x1> x2)
                break;
        }
        return res;
    }
};

你可能感兴趣的:(LeetCode刷题)