Leetcode 螺旋矩阵

WechatIMG587.jpeg

题目描述

leetcode 第54题:螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

spiral1.jpeg

解题方法

模拟参照题解

  • 解题思路

获取矩阵matrix的行数m和列数n
模拟matrix右下左上走过的路径
首先设定四个方向的边界right,down,left,up
按顺序在四个方向上遍历矩阵
创建数组ans来记录每次遍历的元素
向右遍历,重新设定上边界,若上边界大于下边界,跳出循环
向下遍历,重新设定右边界,若右边界小于左边界,跳出循环
向左遍历,重新设定下边界,若下边界小于上边界,跳出循环
向上遍历,重新设定左边界,若左边界大于右边界,跳出循环
最终在四个方向都没有可遍历的元素,表示遍历完成
得到的ans就是矩阵按照顺时针螺旋顺序返回的所有元素

  • 复杂度

时间复杂度:O(mn),m和n分别为矩阵的行数和列数
空间复杂度:O(1)

  • 代码实现

python3

class Solution:
    def spiralOrder(self,matrix: List[List[int]]) -> List[int]:
        m,n = len(matrix),len(matrix[0])
        right,down,left,up = n-1,m-1,0,0
        result = []
        while True:
            for i in range(left,right+1):
                result.append(matrix[up][i])
            up += 1
            if up > down:
                break

            for i in range(up,down+1):  
                result.append(matrix[i][right])
            right -= 1 
            if right < left:
                break

            for i in range(right,left-1,-1):
                result.append(matrix[down][i])
            down -= 1
            if down < up:
                break

            for i in range(down,up-1,-1):
                result.append(matrix[i][left])
            left += 1
            if left > right:
                break
        return result

php

class Solution {
    function spiralOrder($matrix) {
        $m = count($matrix);
        $n = count($matrix[0]);
        $right = $n-1; 
        $down = $m-1;
        $left = 0;
        $up = 0;
        $ans = [];
        while(true){
            for($i=$left;$i<=$right;$i++){
                array_push($ans,$matrix[$up][$i]);
            }
            $up++;
            if($up>$down) break;

            for($i=$up;$i<=$down;$i++){
                array_push($ans,$matrix[$i][$right]);
            }
            $right--;
            if($right<$left) break;

            for($i=$right;$i>=$left;$i--){
                array_push($ans,$matrix[$down][$i]);
            }
            $down--;
            if($down<$up) break;

            for($i=$down;$i>=$up;$i--){
                array_push($ans,$matrix[$i][$left]);
            }
            $left++;
            if($left>$right) break;
        }
        return $ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值