Leetcode hot100 螺旋矩阵【中等】

和旋转矩阵一样,这个题同样是模拟实现题,就是你脑子里咋想的,用代码还原出来就行。

连直觉都不用靠,过程就是图中画的那样,螺旋着走。

先给代码看看大致吧:

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int size=matrix.length*matrix[0].length;
        List<Integer> list = new ArrayList<Integer>();

        //初始化
        int top=1;
        int bottom=matrix.length-1;
        int left=0; 
        int right=matrix[0].length-1;
        
        //初始化
        int x=0;
        int y=-1;  //因为下面的循环里y要先++,所以y从-1开始
        int count=0;

        while(true){
            //先走,再判断
            y++;
            //往右
            while(y<=right) { list.add(matrix[x][y]);count++; y++; }
            if(count==size) break;
            y--;//走出去了一步,处理一下
            right--;//右边界收缩 PS:不用怕边界收缩成负数, 负数了也无所谓,有count控制在合适的时机就退出了

            x++;//先走一步
            //往下
            while(x<=bottom){list.add(matrix[x][y]);count++; x++;}
            if(count==size) break;
            x--;//走出去了一步,处理一下
            bottom--;//下边界收缩

            y--;
            //往左
            while(y>=left){list.add(matrix[x][y]);count++;y--;}
            if(count==size) break;
            y++;//走出去了一步,处理一下
            left++; //左边界收缩

            x--;
            //往上走
            while(x>=top){list.add(matrix[x][y]);count++;x--;}
            if(count==size) break;
            x++; ////走出去了一步,处理一下
            top++; //上边界收缩
            }
            return list;
    }
}

其实就是脑海里演练整个过程,一开始先往右走。往右走就是x不变y一直加加,加到啥时候停下呢?到达右边界 的时候,然后往下走,往下走就是y不变x一直加加,加到啥时候停下呢?到达下边界 的时候,然后往左走,往左走就是x不变y一直减减,啥时候停下呢?到达左边界 的时候。然后往上走,往上走就是y不变x一直减减,啥时候停下呢?到达上边界的时候。然后又开始往右走,这是一个循环。

这么一通分析,你就明白了,难点主要是两点:

**难点1:**一是4个边界的维护

**难点2:**二是退出循环的条件

难点1 :边界处理最难受了。首先,四个边界是取不溢出的最大下标,还是取刚好溢出的下标呢?比如说我一行有4个数,右边界是y=3还是y=4呢?取前者的话用<=去判断边界,取后者的话用<去判断,直觉<=更方便,所以这里用不溢出的最大下标 。再其次还要考虑,4个角上的值属于前一趟走的还是下一趟,我让他属于上一趟,直觉属于上一趟更方便

**难点2:**退出循环的条件。与其乱七八糟的弄边界的判断(比如,right或者left到达边界并且top==left的时候 OR top或者bottom到达边界,我不确定对不对哈),不如直接弄个count计数,天才!

相关推荐
find1star4 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing4 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21124 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP6 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN6 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218316 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤7 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate7 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran7 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹8 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统