leetcode第54题

简介: 在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。


image.png

从第一个位置开始,螺旋状遍历二维矩阵

image.png

解法一

可以理解成贪吃蛇,从第一个位置开始沿着边界走,遇到边界就转换方向接着走,直到走完所有位置。

/** direction 0 代表向右, 1 代表向下, 2 代表向左, 3 代表向上*/publicList<Integer>spiralOrder(int[][] matrix) {
List<Integer>ans=newArrayList<>();
if(matrix.length==0){
returnans;
    }
intstart_x=0, 
start_y=0,
direction=0, 
top_border=-1,  //上边界right_border=matrix[0].length,  //右边界bottom_border=matrix.length, //下边界left_border=-1; //左边界while(true){
//全部遍历完结束if (ans.size() ==matrix.length*matrix[0].length) {
returnans;
        }
//注意 y 方向写在前边,x 方向写在后边ans.add(matrix[start_y][start_x]);
switch (direction) {
//当前向右case0:
//继续向右是否到达边界//到达边界就改变方向,并且更新上边界if (start_x+1==right_border) {
direction=1;
start_y+=1;
top_border+=1;
                } else {
start_x+=1;
                }
break;
//当前向下case1:
//继续向下是否到达边界//到达边界就改变方向,并且更新右边界if (start_y+1==bottom_border) {
direction=2;
start_x-=1;
right_border-=1;
                } else {
start_y+=1;
                }
break;
case2:
if (start_x-1==left_border) {
direction=3;
start_y-=1;
bottom_border-=1;
                } else {
start_x-=1;
                }
break;
case3:
if (start_y-1==top_border) {
direction=0;
start_x+=1;
left_border+=1;
                } else {
start_y-=1;
                }
break;
        }
    }
}

时间复杂度:O(m * n),m 和 n 是数组的长宽。

空间复杂度:O(1)。

在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。

相关文章
|
7月前
|
C++ Python
leetcode-283:移动零
leetcode-283:移动零
30 0
|
7月前
|
算法
leetcode:389. 找不同
leetcode:389. 找不同
29 0
|
7月前
leetcode-475:供暖器
leetcode-475:供暖器
50 0
|
Python
LeetCode 1904. 你完成的完整对局数
一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。
106 0
|
测试技术
一和零(LeetCode-474)
一和零(LeetCode-474)
139 0
一和零(LeetCode-474)
leetcode 283 移动零
leetcode 283 移动零
57 0
|
算法
LeetCode——944. 删列造序
LeetCode——944. 删列造序
111 0
leetcode第36题
一个 9 * 9 的数独的棋盘。判断已经写入数字的棋盘是不是合法。需要满足下边三点, • 每一行的数字不能重复 • 每一列的数字不能重复 • 9 个 3 * 3 的小棋盘中的数字也不能重复。 只能是 1 - 9 中的数字,不需要考虑数独最后能不能填满
leetcode第36题
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题