21-3-15 力扣每日刷题 54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

在这里插入图片描述

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

在这里插入图片描述

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


这种题型应该需要注意一下几个点

  • 起始位置
  • 运动方向
  • 结束标志
  • 边界

开始分析:

  1. 起始位置
    很明显其实位置是[0,0]
  2. 运动方向
    右→下→左→上    循环
  3. 结束标志
    输出list的长度等于需要输出元素的数量
  4. 边界
    到最右边时 top++
    到最下边时 right–
    到最左边时 bottom–
    到最上边时 left++

下附java运行代码

package isLeetcode;

import java.util.ArrayList;
import java.util.List;

public class Solution315 {
    public static List<Integer> spiralOrder(int[][] matrix) {
        int m=matrix.length; //纵向长度
        int n=matrix[0].length;//横向长度
        List<Integer> order = new ArrayList<Integer>();
        //边界
        int left =0;
        int right=n-1;
        int top=0;
        int bottom=m-1;
        //方向
        int cur_d=0;    //0右  1下  2左  3上
        int [][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};  //移动方向对应的数据加减
        //目前位置下标
        int x=0,y=0;  //x为纵 y为横
        //arr数组存放标记
        int i=0;

        while(order.size()!=m*n){
            order.add(matrix[x][y]);
            i++;
            if(cur_d==0 && y==right){  //到达右边界
                cur_d++;
                top++;
            }else if(cur_d==1 && x==bottom){   //到达下边界
                cur_d++;
                right--;
            }else if(cur_d==2 && y==left){  //到达左边界
                cur_d++;
                bottom--;
            }else if(cur_d==3 && x==top){   //到达上边界
                cur_d++;
                left++;
            }
            cur_d %=4;
            x+=dirs[cur_d][0];
            y+=dirs[cur_d][1];
        }
        return  order;
    }

    public static void main(String[] args) {
        int [][]arr={{1,2,3},{4,5,6},{7,8,9}};
        System.out.println(spiralOrder(arr));
    }
}


此文章创于本人学习时的记录,如有错误或更优解还请指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值