顺时针打印矩阵(Python and C++解法)

题目:

  输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof

思路:

A00  A01  A02  A03

D10  E11  E12  B13

D20  G21  F22    B23

C30    C31  C32  B33 

第一圈的起点(0,0),第二圈的起点(1,1)...

打印循环终止条件:对于一个n*m矩阵,存在2*star < n and 2*start <m

每一行每一列的打印前提条件见C++注释。

C++解法:

 1 class Solution {
 2 public:
 3     vector<int> spiralOrder(vector<vector<int>>& matrix) {
 4         if (matrix.size() == 0)  return {};  // 返回空的方法
 5         int rows = matrix.size(), columns = matrix[0].size();
 6         vector<int> orderResult;  // 存储结果
 7         int start = 0;  // 起点
 8 
 9         while (rows > 2 * start && columns > 2 * start) {  // 打印终止的条件
10             int endX = columns - 1 - start;  // 终止行号
11             int endY = rows - 1 - start;  // 终止列号
12 
13             // 从左到右打印,这一步总会有 
14             for (int i = start; i <= endX; i++)
15                 orderResult.push_back(matrix[start][i]);
16             // 判断是否需要从上到下打印,终止行号需要大于起始行号
17             if (start < endY)
18                 for (int i = start + 1; i <= endY; i++)  // 从上到下打印
19                     orderResult.push_back(matrix[i][endX]);
20             // 判断是否需要从右到左打印,终止行/列号都需要大于起始行/列号,即至少两行两列
21             if (start < endX && start < endY)
22                 for (int i = endX - 1; i >= start; i--)
23                     orderResult.push_back(matrix[endY][i]);
24             // 判断是否需要从下到上打印,不仅终止列号需要大于起始列号,终止行号也要比起始行号大2,即至少三行两列
25             if (start < endX && start < endY - 1)
26                 for (int i = endY - 1; i >= start + 1; i--)
27                     orderResult.push_back(matrix[i][start]);
28 
29             start += 1;
30         }
31         return orderResult;
32     }
33 };

Python解法:

 1 class Solution:
 2     def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
 3         if len(matrix) == 0:
 4             return []
 5         rows = len(matrix)
 6         colums = len(matrix[0])
 7         start = 0
 8         orderResult = []
 9 
10         while rows > 2 * start and colums > 2 * start:
11             endX = colums - 1 - start
12             endY = rows - 1 - start
13 
14             for i in range(start, endX+1):  #  从左到右打印
15                 orderResult.append(matrix[start][i])
16 
17             if endY > start:  # 从上到下打印
18                 for i in range(start + 1, endY+1):
19                     orderResult.append(matrix[i][endX])
20 
21             if endX > start and endY > start:  # 从右到左打印
22                 for i in range(endX - 1, start - 1, -1):
23                     orderResult.append(matrix[endY][i])
24 
25             if endX > start and endY - 1 > start:  # 从下到上打印
26                 for i in range(endY - 1, start, -1):
27                     orderResult.append(matrix[i][start])
28 
29             start += 1
30         return orderResult
posted @ 2020-07-07 22:49  孔子?孟子?小柱子!  阅读(222)  评论(0编辑  收藏  举报