leetcode54-螺旋矩阵

原题

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

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

示例 2:

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

解法

思想

拐点规律移动规律

  1. 当横坐标x等于纵坐标y+1时,且之前是向上移动的,拐点向右。
  2. 当横坐标x加纵坐标y等于列数减一,且之前是向右移动的,拐点向下。
  3. 当行数和横坐标x之差等于列数与纵坐标y之差时,且之前是向下移动的,拐点向左。
  4. 当横坐标x加纵坐标y等于行数减一,且之前是向左移动的,拐点向上。

当不满足上述拐点情况时,坐标会随着之前的运动方向继续运动。可以设置代表四个方向运动状态的布尔值来记录运动状态。

代码

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix==null) return null;
        int x = matrix.length;
        List<Integer> ret = new ArrayList<Integer>();
        if(x==0) return ret;
        int y = matrix[0].length;//获取二维数组的行数和列数,排除null和空情况。

        int x_now=0,y_now=0;
        int size = x*y;
        //代表向各个方向移动的布尔值。
        boolean toRight=true,toLeft=false,toTop=false,toBottom=false;

        for(int i=0;i<size;i++) {
            ret.add(matrix[x_now][y_now]);
            if(x_now==y_now+1&&toTop) {//拐向右
                toRight=true;
                toTop=false;
            }else if(y_now==y-x_now-1&&toRight) {//拐向下
                toBottom=true;
                toRight=false;
            }else if(x-x_now==y-y_now&&toBottom){//拐向左
                toLeft=true;
                toBottom=false;
            }else if(x_now==x-y_now-1&&toLeft) {//拐向上
                toTop=true;
                toLeft=false;
            }
            //移动坐标
            if(toRight) y_now++;
            if(toLeft) y_now--;
            if(toTop) x_now--;
            if(toBottom) x_now++;
        }
        return ret;
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode54-%e8%9e%ba%e6%97%8b%e7%9f%a9%e9%98%b5/

(0)
彭晨涛彭晨涛管理者
上一篇 2019年11月14日
下一篇 2019年11月18日

相关推荐

  • leetcode198-打家劫舍

    原题 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会…

    算法 2020年5月29日
    060
  • 蓝桥杯试题-翻硬币

    原题 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明正在玩一个“翻硬币”的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写…

    算法 2020年3月1日
    0140
  • leetcode55-跳跃游戏

    原题 原题 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例1: 输入: [2,3,1…

    算法 2020年2月9日
    090
  • leetcode279-完全平方数

    原题 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1: 输入: n = 12 输出…

    2019年12月11日
    0150
  • leetcode219-存在重复元素II

    原题 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。 示例1…

    算法 2019年12月24日
    0190
  • leetcode135-分发糖果

    原题 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个…

    算法 2020年2月17日
    060
  • leetcode1248-统计「优美子数组」

    原题 给你一个整数数组 nums 和一个整数 k。 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。 请返回这个数组中「优美子数组」的数目。 …

    算法 2020年4月21日
    0320
  • leetcode106-从中序与后序遍历序列构造二叉树

    原题 根据一棵树的中序遍历与后序遍历构造二叉树。 注意:你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postor…

    算法 2020年1月13日
    0380
  • leetcode498-对角线遍历

    这是一个Z字形编排问题,JEPG的编码过程中也会用到。 原题 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下…

    2019年11月14日
    0110
  • leetcode543-二叉树的直径

    原题 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。 示例: 给定二叉树 1 / \ 2 3 / \ 4 5…

    算法 2020年3月10日
    0210

发表回复

登录后才能评论