题解 | #牧场边界巡游#

牧场边界巡游

https://www.nowcoder.com/practice/bc7fe78f7bcc49a8bc0afdd7a55ca810

  • 题目考察的知识点 : 对矩阵的遍历方式,通常使用的是遍历过的地方就标记一下,但这道题比较巧的地方在于遍历的时候一直是在边界附近
  • 题目解答方法的文字分析:本题可以对矩阵逆时针旋转模拟,当确定了每一圈螺旋的上下左右边界后,可以按照“上边界 -> 右边界 -> 下边界 -> 左边界”的方式依次进行。当走完一圈后,上下左右边界同时内缩,即上边界左边界累加,下边界右边界累减,直到最终top > bottom或者left > right不构成圈了。
  • 本题解析所用的编程语言:Python
  • 完整且正确的编程代码

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param matrix int整型二维数组 
# @return int整型一维数组
#
class Solution:
    def spiralTravelCounterClockwise(self , matrix: List[List[int]]) -> List[int]:
        # write code here
        # 边界模拟法
        top = 0                     # 上边界,初始为首行
        left = 0                    # 左边界,初始为首列
        bottom = len(matrix) - 1    # 下边界,初始为最后一行
        right = len(matrix[0]) - 1  # 上边界,初始为首行
        res = []
        # 只有当上边界小于等于下边界且左边界小于等于右边界时,才构成一个边界圈
        while left <= right and top <= bottom:
            # 从上到下,加入上边界的所有元素
            for r in range(top, bottom + 1):
                res.append(matrix[r][left])
                        # 从左到右,加入上边界的所有元素
            for c in range(left + 1, right + 1):
                res.append(matrix[bottom][c])
            # 如果此时上下边界重合(单行)或左右边界重合(单列),无需再遍历,否则重复。
            if top == bottom or left == right:
                 break
            # 从下到上,加入左边界除了与上下边界交界的元素
            for r in range(bottom - 1, top - 1, -1):
                res.append(matrix[r][right])
            # 从右到左,加入下边界除了与右边界交界的元素
            for c in range(right - 1, left, -1):
                res.append(matrix[top][c])
            top += 1        # 上边界下移
            left += 1       # 左边界右移
            bottom -= 1     # 下边界上移
            right -= 1      # 右边界左移
        return res
牛客高频top202题解系列 文章被收录于专栏

记录刷牛客高频202题的解法思路

全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-05 04:14
已编辑
真烦好烦真烦:看着感觉好强啊,这都过不了吗
投递字节跳动等公司10个岗位 面试中的破防瞬间
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务