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

相关文章
|
4月前
leetcode-1219:黄金矿工
leetcode-1219:黄金矿工
64 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
67 0
|
算法
LeetCode——944. 删列造序
LeetCode——944. 删列造序
101 0
|
算法 Java
一和零(LeetCode 474)
一和零(LeetCode 474)
87 0
|
机器学习/深度学习
leetcode第50题
求幂次方,用最简单的想法,就是写一个 for 循环累乘。 至于求负幂次方,比如 2^{-10}2−10,可以先求出 2^{10}210,然后取倒数,1/2^{10}1/210 ,就可以了 double mul = 1; if (n > 0) { for (int i = 0; i < n; i++) { mul *= x; } } else { n = -n; for (int i = 0; i < n; i++) { mul *= x; } mul = 1 / mul; }
leetcode第50题
|
存储 算法
leetcode第43题
个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。
leetcode第43题
leetcode第51题
较经典的回溯问题了,我们需要做的就是先在第一行放一个皇后,然后进入回溯,放下一行皇后的位置,一直走下去,如果已经放的皇后的数目等于 n 了,就加到最后的结果中。然后再回到上一行,变化皇后的位置,然后去找其他的解。 期间如果遇到当前行所有的位置都不能放皇后了,就再回到上一行,然后变化皇后的位置。再返回到下一行。 说起来可能还费力些,直接看代码吧。
leetcode第51题
|
存储
leetcode第56题
常规的思想,将大问题化解成小问题去解决。 假设给了一个大小为 n 的列表,然后我们假设 n - 1 个元素的列表已经完成了全部合并,我们现在要解决的就是剩下的 1 个,怎么加到已经合并完的 n -1 个元素中。 这样的话分下边几种情况, 我们把每个范围叫做一个节点,节点包括左端点和右端点。 1. 如下图,新加入的节点左端点和右端点,分别在两个节点之间。这样,我们只要删除
leetcode第56题
leetcode第53题
解法一和解法二的动态规划,只是在定义的时候一个表示以 i 开头的子数组,一个表示以 i 结尾的子数组,却造成了时间复杂度的差异。问题就是解法一中求出了太多的没必要的和,不如解法二直接,只保存最大的和。
leetcode第53题
leetcode第21题
总 递归看起来,两个字,优雅!但是关于递归的时间复杂度,空间复杂度的求法,先留个坑吧。
leetcode第21题