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

相关文章
|
1月前
【LeetCode 02】暴力法总结
【LeetCode 02】暴力法总结
15 1
|
6月前
leetcode-475:供暖器
leetcode-475:供暖器
48 0
LeetCode 389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
72 0
|
算法 Java
一和零(LeetCode 474)
一和零(LeetCode 474)
97 0
|
算法
leetcode第47题
基本上都是在上道题的基础上改出来了,一些技巧也是经常遇到,比如先排序,然后判断和前一个是否重复。利用 Hash 去重的功能。利用原来的存储空间隐藏掉数据,然后再想办法还原。
leetcode第47题
leetcode第46题
这是自己开始想到的一个方法,考虑的思路是,先考虑小问题怎么解决,然后再利用小问题去解决大问题。没错,就是递归的思路。比如说, 如果只有 1 个数字 [ 1 ],那么很简单,直接返回 [ [ 1 ] ] 就 OK 了。 如果加了 1 个数字 2, [ 1 2 ] 该怎么办呢?我们只需要在上边的情况里,在 1 的空隙,也就是左边右边插入 2 就够了。变成 [ [ 2 1 ], [ 1 2 ] ]。
leetcode第46题
|
存储
leetcode第57题
和上一道可以说是一个问题,只不过这个是给一个已经合并好的列表,然后给一个新的节点依据规则加入到合并好的列表。 解法一 对应 56 题的解法一,没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题, 所以直接加过来就行了
leetcode第57题
leetcode第25题
时间复杂度:while 循环中本质上我们只是将每个结点访问了一次,加上结点倒置访问的一次,所以总共加起来每个结点其实只访问了 2 次。所以时间复杂度是 O(n)。 空间复杂度:O(1)。 解法二递归 有没有被解法一的各种指针绕晕呢,我们有一个更好的选择,递归,这样看起来就会简洁很多。 public ListNode reverseKGroup(ListNode head, int k) { if (head == null) return null; ListNode point = head; //找到子链表的尾部 int i = k;
leetcode第25题