美文网首页
IOS 算法(中级篇) ----- 螺旋矩阵

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

作者: ShawnAlex | 来源:发表于2021-03-15 16:31 被阅读0次

    给你一个 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 算法合集地址

    相关文章

      网友评论

          本文标题:IOS 算法(中级篇) ----- 螺旋矩阵

          本文链接:https://www.haomeiwen.com/subject/sejxcltx.html