zoukankan      html  css  js  c++  java
  • [LeetCode 题解] Spiral Matrix

    前言

    【LeetCode 题解】系列传送门:
    http://www.cnblogs.com/double-win/category/573499.html

    题目链接

    54. Spiral Matrix

    题目描述

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

    For example,
    Given the following matrix:

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

    You should return [1,2,3,6,9,8,7,4,5].

    题意

    按照螺旋的方式返回矩阵中的各个元素。
    例如,给定如下矩阵

    [
    [ 1, 2, 3 ],
    [ 4, 5, 6 ],
    [ 7, 8, 9 ]
    ]
    其对应的结果为 [1, 2, 3, 6, 9, 8, 7, 4, 5]

    思路

    根据题意提取关键信息:
    (1) m x n elements (m rows, n columns), 没有特意强调 m 和n 非负, 因此在边界判断是需要考虑空数组
    (2) 螺旋的方式, 从结果可以看出是按照顺时针方向依次遍历的。
    每次都是按照一个方向一直遍历, 直到该方向上所有的数据都访问过, 那么就转换到下一个方向。
    从上一个方向开始, 每个点可能的方向最多有4个, 如果四个方向的下一个点都被遍历过, 则说明碰到了终点。

    解法

    class Solution(object):
        def bfs(self, matrix, i, j, last = 0):
            """
            :type matrix: List[List[int]]
            :type i: int current row index
            :type j: int current column index
            :rtype: void
            """
            if self.visited[i][j] == 0:
                self.visited[i][j] = 1
                self.res.append(matrix[i][j])
            retry = 0
            while retry < 4:
                if last % 4 == 0:
                    if j + 1 <= self.n - 1 and self.visited[i][j + 1] == 0:
                        self.bfs(matrix, i, j + 1, last)
                elif last % 4 == 1: 
                    if i + 1 <= self.m - 1 and self.visited[i + 1][j] == 0:
                        self.bfs(matrix, i + 1, j, last)
                elif last % 4 == 2:
                    if j - 1 >= 0 and self.visited[i][j - 1] == 0:
                        self.bfs(matrix, i, j - 1, last)
                elif last % 4 == 3:
                    if i - 1 >= 0 and self.visited[i - 1][j] == 0:
                        self.bfs(matrix, i - 1, j, last)
                last += 1
                retry += 1
    
    
        def spiralOrder(self, matrix):
            """
            :type matrix: List[List[int]]
            :rtype: List[int]
            """
            self.visited = []
            self.res = []
            self.m = len(matrix)
            if self.m == 0:
                # the matrix is empty
                return self.res
            self.n = len(matrix[0])
            for i in range(self.m):
                line = []
                for j in range(self.n):
                    line.append(0)
                self.visited.append(line[:])
            self.bfs(matrix, 0, 0)
            return self.res
    
    

    声明

    作者 Double_Win
    出处 http://www.cnblogs.com/double-win/p/7979672.html
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则作者保留追究法律责任的权利。 若本文对你有所帮助,您的关注和推荐是我们分享知识的动力!
  • 相关阅读:
    PDB文件详解
    C++模板常用功能讲解
    Windows下多线程编程(二)
    关于静态库中使用全局变量可能导致的问题
    js中的函数
    js中字符串的加密base64
    列表推导式
    函数和方法的区别
    xshell连不上虚拟机
    网络编程,并行,并发和协程
  • 原文地址:https://www.cnblogs.com/double-win/p/7979672.html
Copyright © 2011-2022 走看看