给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
例子:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入: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 算法合集地址