Acceml
V2EX  ›  C

[每天刷 Leetcode-求组队] 54. 螺旋矩阵

  •  
  •   Acceml · Aug 26, 2018 · 5541 views
    This topic created in 2997 days ago, the information mentioned may be changed or developed.

    题目

    给定一个包含 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,4,8,12,11,10,9,5,6,7]
    

    题解

    这个题目很简单,上下左右分别用四个变量去标志: 上:top 下:bottom 左:left 右: right

    就按照四步走就可以:

    1. left -> right
    2. top -> bottom
    3. right -> left
    4. bottom -> top

    每一步走完要对边界做出调整,具体看代码吧,清晰易懂。

    class Solution {
        public List<Integer> spiralOrder(int[][] matrix) {
            List<Integer> res = new ArrayList<Integer>();
            if (matrix.length == 0 || matrix[0].length == 0) return res;
    
            int top = 0;
            int bottom = matrix.length - 1;
            int left = 0;
            int right = matrix[0].length - 1;
    
            while (true) {
                for (int i = left; i <= right; i++) res.add(matrix[top][i]);
                top++;
                if (left > right || top > bottom) break;
    
                for (int i = top; i <= bottom; i++) res.add(matrix[i][right]);
                right--;
                if (left > right || top > bottom) break;
    
                for (int i = right; i >= left; i--) res.add(matrix[bottom][i]);
                bottom--;
                if (left > right || top > bottom) break;
    
                for (int i = bottom; i >= top; i--) res.add(matrix[i][left]);
                left++;
                if (left > right || top > bottom) break;
            }
    
            return res;
        }
    }
    

    热门阅读

    32 replies  •  2018-08-28 16:20:18 +08:00
    CEBBCAT
    CEBBCAT
    Aug 26, 2018 via Android❤️1
    1
    是组队还是广告啊😯? @Livid 站长我都替你心疼你的鼠标微动
    CEBBCAT
    CEBBCAT
    Aug 26, 2018 via Android
    2
    两个问题:
    1. 为什么不换行?这样对后续阅读和维护有什么好处吗?比如:`if (left > right || top > bottom) break;`
    2. res 数组为什么不事先划定大小?这样可以加快很多的吧
    RqPS6rhmP3Nyn3Tm
    RqPS6rhmP3Nyn3Tm
    Aug 26, 2018 via iPhone
    3
    这道题不难。用一个 rounds 记录转了几圈就可以了。
    Acceml
    Acceml
    OP
    Aug 26, 2018❤️1
    4
    @CEBBCAT 不是广告啊,就记录一下自己的公众号,没多少人关注,广告个毛线啊。
    laxenade
    laxenade
    Aug 26, 2018 via Android
    5
    剧透: 正确的做法是竖着 flip 一次然后横着 flip 一次
    SorcererXW
    SorcererXW
    Aug 26, 2018
    6
    如果用类似 dfs 搜索的方式思考的话, 可能会优雅一点(程序效率可能会低一点
    初始向右方前进
    如果当前方向可行, 就继续前进
    如果不行了, 就切换到下一个方向
    右的下一个方向是下, 下的下一个是左, 左的下一个是上, 上的下一个是右
    k9ox
    k9ox
    Aug 26, 2018 via Android
    7
    这题不难啊,讨论个屁啊😯我记得有一题是数独的解,难到爆炸,而且讨论区有李显龙的解法🤣🤣
    msg7086
    msg7086
    Aug 26, 2018❤️1
    8
    def spiral_order m
    return [] if m.size == 0
    m.shift + spiral_order(m.transpose.reverse)
    end

    之前看到过的写得最简洁的 Ruby 解法。
    ayyll
    ayyll
    Aug 26, 2018 via Android
    9
    打 cf 吧 半夜被 hack 到哭(逃
    a554340466
    a554340466
    Aug 26, 2018 via iPhone
    10
    这不就是 剑指 offer 前面章节讲的吗
    LadyChunsKite
    LadyChunsKite
    Aug 26, 2018❤️1
    11
    楼主该不会准备把这样的贴子发 800 多个吧?
    Acceml
    Acceml
    OP
    Aug 26, 2018
    12
    @laxenade 没懂,是啥意思。
    Acceml
    Acceml
    OP
    Aug 26, 2018
    13
    @LadyChunsKite 是的。
    Acceml
    Acceml
    OP
    Aug 26, 2018
    14
    @a554340466 嗯嗯,就是简单的找规律的题呗。
    Acceml
    Acceml
    OP
    Aug 26, 2018
    15
    @CEBBCAT 短小就是美。
    Acceml
    Acceml
    OP
    Aug 26, 2018
    16
    @k9ox 嗯嗯,不难,就是记录一下自己的题解。恰好有人讨论就更开心啦~~
    Acceml
    Acceml
    OP
    Aug 26, 2018
    17
    @msg7086 没写过 ruby,这个有顺序的 special order dfs 很屌的感觉,但是代码看起来不会很简洁?
    Acceml
    Acceml
    OP
    Aug 26, 2018
    18
    @ayyll 其实工作的技术能力并不等于 leetcode 算法能力,只是过段时间要准备跳槽,所以发在公众号上和大家交流一下。不然真他妈的坚持不下去啊。
    zeR0f1re
    zeR0f1re
    Aug 26, 2018
    19
    @Acceml 抱抱粗腿,观摩一下
    yumenawei
    yumenawei
    Aug 26, 2018
    20
    @Acceml 等十月份再看看?还是跳定了呀
    snxq1995
    snxq1995
    Aug 26, 2018❤️1
    21
    开个群比较好交流,这样的公众号其他人参与度不高。
    ayyll
    ayyll
    Aug 27, 2018 via Android
    22
    @Acceml leetcode 太水了 真谈算法能力 还是上 tc/cf 吧 打到 rank 前 10 标准的青年计算机科学家
    Acceml
    Acceml
    OP
    Aug 27, 2018
    23
    @snxq1995 好滴~~
    Acceml
    Acceml
    OP
    Aug 27, 2018
    24
    @yumenawei 看看再跳呗。
    Acceml
    Acceml
    OP
    Aug 27, 2018
    25
    @ayyll 我的初衷就是为了准备下面试,我认为算法能力和工程能力完全不等价。不会花很多时间在上面,你所谓的水在我看来足够即可。
    Elephant696
    Elephant696
    Aug 27, 2018
    26
    这个题,,,以前面试的时候二面面试官叫我用笔手写这个算法,,,我当时告诉他说我只能说思路,手写写不出来,然后被对方请出去了,没错,是请出去了。记忆深刻。
    PS:我面试是前端。。。
    coffeSlider
    coffeSlider
    Aug 27, 2018 via Android
    27
    这个题只用一个变量就能解呢
    Acceml
    Acceml
    OP
    Aug 27, 2018
    28
    @Elephant696 哪家面试官,这么虎的吗?
    Acceml
    Acceml
    OP
    Aug 27, 2018
    29
    @coffeSlider 用一个变量,需要记住走的步数?
    coffeSlider
    coffeSlider
    Aug 27, 2018 via Android
    30
    @Acceml 简单的来说,就是用一个数来记录四个方向和走了几圈
    ayyll
    ayyll
    Aug 27, 2018 via Android
    31
    @Acceml 行 8 good luck
    Elephant696
    Elephant696
    Aug 28, 2018 via iPhone
    32
    @Acceml 一个创业公司,名字就不说了。太菜了不敢大声说话
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   510 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 21:32 · PVG 05:32 · LAX 13:32 · JFK 16:32
    ♥ Do have faith in what you're doing.