IOS 算法(中级篇) ----- 螺旋矩阵

2021-03-15  本文已影响0人  ShawnAlex

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

例子:

example1

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

example2

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

解题思路:

模拟箭头移动
设置个标识符arrow用来判断是朝向那个方向走

例:
arrow == "right", 向右走, 走到右边界令 arrow == "down", 改变方向向下走, 上边界+1
arrow == "down", 向下走, 走到下边界令 arrow == "left", 改变方向向左走, 右边界-1
arrow == "left", 向左走, 走到左边界令 arrow == "up", 改变方向向上走, 下边界-1
arrow == "up", 向上走, 走到上边界令 arrow == "right", 改变方向向右走, 左边界+1
依次循环

代码:

未翻译版
    func spiralOrder(_ matrix: [[Int]]) -> [Int] {

       var result = [matrix[0][0]], a = 0, b = 0, arrow = "right",
            leftmin = 0, rightmax = matrix[0].count - 1,
            upmin = 0, downmax = matrix.count - 1
        
        if matrix[0].count == 1 { arrow = "down" }
        
        while result.count < matrix.count * matrix[0].count {
            
            if arrow == "right" {
                b += 1
                if b == rightmax {
                    upmin += 1
                    arrow = "down"
                }
            }else if arrow == "down" {
                a += 1
                if a == downmax {
                    rightmax -= 1
                    arrow = "left"
                }
            }else if arrow == "left"{
                b -= 1
                if b == leftmin {
                    downmax -= 1
                    arrow = "up"
                }
            }else if arrow == "up"{
                a -= 1
                if a == upmin {
                    leftmin += 1
                    arrow = "right"
                }
            }
            
            result.append(matrix[a][b])
        }
        
        return result
    }

翻译版
    func spiralOrder(_ matrix: [[Int]]) -> [Int] {
        
        /** 
        定义一些初始值
       
        result: 最后结果, 初始值:[matrix[0][0]] (设置成空数组[]也行)

        a, b: 数组元素 matrix[a][b]下标值, 初始都为0
        
        arrow: 箭头方向, 初始为 "right"

        leftmin, rightmax, upmin, downmax: 左, 右, 上, 下 边界值
 
        */
        var result = [matrix[0][0]], a = 0, b = 0, arrow = "right",
            leftmin = 0, rightmax = matrix[0].count - 1,
            upmin = 0, downmax = matrix.count - 1
        
        // 如果只有一个元素, 箭头不需要向右, 改成向下 "down"
        if matrix[0].count == 1 { arrow = "down" }
        
        // 循环, 都添加完跳出循环
        while result.count < matrix.count * matrix[0].count {
            
            // 如果 arrow == "right" 向右走
            if arrow == "right" {

                // b = b + 1 顺时针添加下一个元素
                b += 1
                // 判断如果走到右边界
                if b == rightmax {
                    // 最小上边界走完 +1
                    upmin += 1
                    // 向下走 arrow改成"down"
                    arrow = "down"
                }

            // 如果 arrow == "down" 向下走
            }else if arrow == "down" {

                // a = a + 1 顺时针添加下一个元素
                a += 1
                // 判断如果走到下边界
                if a == downmax {
                    // 最大右边界走完 -1 
                    rightmax -= 1
                    // 向左走 arrow改成"left"
                    arrow = "left"
                }

            // 如果 arrow == "left" 向左走
            }else if arrow == "left"{

                // b = b - 1 顺时针添加下一个元素
                b -= 1
                // 判断如果走到左边界
                if b == leftmin {
                    // 最大下边界走完 -1
                    downmax -= 1
                    // 向上走 arrow改成"up"
                    arrow = "up"
                }

            // 如果 arrow == "up" 向左走
            }else if arrow == "up"{

                // a = a - 1 顺时针添加下一个元素
                a -= 1
                // b = b - 1 顺时针添加下一个元素
                if a == upmin {
                    // 最小左边界走完 +1 
                    leftmin += 1
                    // 向右走 arrow改成"right" 
                    arrow = "right"
                }
            }
            // result添加元素
            result.append(matrix[a][b])  
        }
        
        // 返回结果
        return result
    }

题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址

上一篇下一篇

猜你喜欢

热点阅读