原创 lightcity 光城 2018-11-13

螺旋矩阵你听过?_c++

leetcode爬登之旅(18)

今日知图

屏幕移动

ctrl+b 向上翻页
ctrl+f 向下翻页
H Head 屏幕顶部
M Middle 屏幕中间
L Low 屏幕底部

0.说在前面1.螺旋矩阵2.作者的话


0.说在前面

昨天满课,我还是坚持来刷题了,写文时间是晚上10点45,刷题时间是10点,今日题目leetcode上的螺旋矩阵,这道题思路简单,实现困难,,对于考研的同学建议仔细看看,因为我们考研复试考了的。。。

算法分析及算法实现及算法思路是很重要的,每周两篇算法三部曲,你们坚持下来了?我现在坚持到第18篇了,哈哈,一起坚持下去!

下面一起来分析!

1.螺旋矩阵

题目

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

示例 1:

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

示例 2:

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

思路

先从左往右移动,再从上到下移动,再从右向左移动,再从下到上移动。

分为以上四部分,也就是代码需要实现上述四个流程即可~~

最后发现自己写的代码太烂了,然后学习了一下网上的风格~,修改后如下面实现部分~

实现

class Solution:
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """

        if not matrix:
            return []
        # 最终结果
        output_list = []
        # 行index
        down = len(matrix) - 1
        # 列index
        right = len(matrix[0]) - 1
        left = 0  # 左边
        up = 0  # 上边
        while left <= right and up <= down:
            # 左到右
            i = left
            while True:
                if i > right:
                    break
                output_list.append(matrix[up][i])
                i += 1
            # 行下移
            up += 1
            # 上到下
            j = up
            while True:
                if j > down:
                    break
                output_list.append(matrix[j][right])
                j += 1
            # 列左移
            right -= 1
            # 右到左
            p = right
            if (up <= down):
                while True:
                    if p < left:
                        break
                    # print(matrix[down][p])
                    output_list.append(matrix[down][p])
                    p -= 1
                    # print("----------")
                # 行上移
            down -= 1
            # 下到上
            q = down
            if (left <= right):
                while True:
                    if q < up:
                        break
                    output_list.append(matrix[q][left])
                    q -= 1
            left += 1
        return output_list

分析

时间复杂度:O(n^2),空间复杂度:O(n)

击败人数:82.62%,耗时44ms

学习文章
https://blog.csdn.net/acttell/article/details/80789299

2.作者的话

最后,您如果觉得本公众号对您有帮助,欢迎您多多支持,转发,谢谢!
更多内容,请关注本公众号算法系列!