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日

相关推荐

  • leetcode1431-拥有最多糖果的孩子(儿童节快乐!)

    原题 给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。 对每一个孩子,检查是否存在一种方案,将额…

    算法 2020年6月1日
    0310
  • leetcode1071-字符串的最大公因子

    原题 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。 返回最长字符串 X,要求满足 X 能除尽 …

    算法 2020年3月12日
    0250
  • leetcode779-第K个语法符号

    原题 在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。 给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始) 例子: 输入: N…

    算法 2020年1月22日
    0110
  • leetcode239-滑动窗口最大值

    原题 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最…

    算法 2020年4月21日
    0180
  • leetcode72-编辑距离

    原题 给你两个单词 word1 和 word2 ,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字…

    2020年4月6日
    0120
  • leetcode14-最长公共前缀

    原题 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入: [“flower”,”flow”,”flight”] 输出: “…

    算法 2019年11月18日
    0100
  • 海量数据去重-由BitMap引出的布隆过滤器

    本文参考资源: 那些惊艳的算法们(一)——布隆过滤器_C/C++_xinzhongtianxia的博客-CSDN博客 详解布隆过滤器的原理、使用场景和注意事项 - 简书 概述 昨天…

    2020年2月28日
    01.3K0
  • leetcode79-单词搜索

    原题 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格…

    算法 2020年4月12日
    0130
  • leetcode20-有效的括号

    原题 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序…

    算法 2019年12月11日
    0210
  • leetcode92-反转链表

    原题 https://leetcode.cn/problems/reverse-linked-list-ii/description 题解 头插法 /** * Definition…

    算法 2024年3月28日
    050

发表回复

登录后才能评论