X

LEETCODE 54. Spiral Matrix 解题思路分析

题目大意:

螺旋矩阵

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

示例 1:

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

示例 2:

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

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=54

解题思路分析:

想要顺时针螺旋输出矩阵内所有元素,移动顺序应该是从坐标[0, 0]开始按照右下左上的顺序转动,关键在于判断转弯处,我们定义4个变量t,b,l,r来代表上下左右4个边界,初始时4个边界分别为矩阵边界。再定义一个数组dir[],{0,1}代表向右移动,{0,-1}代表向左移动, {1,0} 是向下移动,{-1,0}则是向上移动。初始时,移动方向为右,即{0,1}。

移动到当前点时,先将当前点加入返回结果,然后根据当前方向得出下一点的坐标,当:

  1. 当前移动方向为右,并且当前右侧点超出右边界r时,方向转为向下。上边t界加一
  2. 当前移动方向为下,并且当前下侧点超出下边界b时,方向转为向左。右边r界减一
  3. 当前移动方向为左,并且当前左侧点超出左边界l时,方向转为向上。下边b界减一
  4. 当前移动方向为上,并且当前上侧点超出上边界t时,方向转为向右。左边l界加一
  5. 上述以外情况,继续沿当前方向移动

实现代码:

public List<Integer> spiralOrder(int[][] matrix) {
    // 返回结果
    List<Integer> res = new ArrayList<>();
    // 如果矩阵为空,返回空
    if(matrix.length==0) return res;
    // 矩阵总元素数
    int count=matrix.length*matrix[0].length;
    // 定义四个边界,初始时为矩阵边界
    int l=0,r=matrix[0].length-1,t=0,b=matrix.length-1;
    // 当前点坐标
    int row=0, col=0;
    // 初始移动方向为向右移动
    int[] dir={0,1};
    // 当返回结果个数小于元素个数时循环
    while(res.size()<count){
        // 将当前点加入返回结果
        res.add(matrix[row][col]);
        // 当前移动方向为右,并且当前右侧点超出右边界r时
        if(dir[1]==1&&col+1>r){
            // 方向转为向下。上边界加一
            dir[0]=1;
            dir[1]=0;
            t++;
        }
        // 当前移动方向为下,并且当前下侧点超出下边界b时
        else if(dir[0]==1&&row+1>b){
            // 方向转为向左。右边界减一
            dir[0]=0;
            dir[1]=-1;
            r--;
        }
        // 当前移动方向为左,并且当前左侧点超出左边界l时
        else if(dir[1]==-1&&col-1<l){
            // 方向转为向上。下边界减一
            dir[0]=-1;
            dir[1]=0;
            b--;
        }
        // 当前移动方向为上,并且当前上侧点超出上边界t时
        else if(dir[0]==-1&&row-1<t){
            // 方向转为向右。左边界加一 
            dir[0]=0;
            dir[1]=1;
            l++;
        }
        // 下一个点坐标
        row+=dir[0];
        col+=dir[1];
    }
    return res;
}

本题解法执行时间为0ms。

Runtime: 0 ms, faster than 100.00% of Java online submissions for Spiral Matrix.

Memory Usage: 40.9 MB, less than 5.21% of Java online submissions for Spiral Matrix.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-54-spiral-matrix-解题思路分析/
Categories: leetcode
kwantong: