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日

相关推荐

  • leetcode99-恢复二叉搜索树

    原题 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 1: 输入: [1,3,null,null,2]    1 …

    算法 2020年3月1日
    080
  • leetcode153-寻找旋转排序数组中的最小值

    原题 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,…

    算法 2020年1月3日
    080
  • leetcode56-合并区间

    原题 给出一个区间的集合,请合并所有重叠的区间。 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]]…

    算法 2020年4月16日
    0160
  • leetcode34--在排序数组中查找元素的第一个和最后一个位置

    原题 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数…

    算法 2020年1月3日
    0150
  • 剑指offer46-把数字翻译成字符串

    原题 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编…

    算法 2020年2月29日
    0300
  • leetcode88-合并两个有序数组

    原题 给定两个有序整数数组 nums1 和 nums2 ,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的…

    算法 2020年2月23日
    080
  • leetcode695-岛屿的最大面积

    原题 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围…

    算法 2020年3月15日
    01230
  • leetcode264-丑数II

    原题 编写一个程序,找出第 n 个丑数。 丑数就是只包含质因数 2, 3, 5 的正整数。 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, …

    算法 2020年2月10日
    0190
  • leetcode200-岛屿数量

    原题 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水…

    算法 2019年11月24日
    0150
  • leetcode35-搜索插入位置

    原题 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 示例 1: 输入: […

    算法 2020年3月2日
    0120

发表回复

登录后才能评论