输入一个二维数组,并对这个数组进行螺旋遍历
样例输入
test_case = [
[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]
]
样例输出
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
Solution
考虑边界条件
直观上直接按照从左到右,
从上到下
在从右到左
然后从下往上即可
但是这只是矩阵为方阵的特殊情况,如果要使用非方阵的矩阵则需要考虑到边界条件
即以下代码中的
for col in reversed(range(start_col,end_col)):
if start_row == end_row:
break
result.append(array[end_row][col])
for row in reversed(range(start_row+1,end_row)):
if start_col == end_col:
break
result.append(array[row][start_col])
否则会带来额外的输出。
例如如果输入:
test_case = [
[1, 2, 3, 4],
[10,11,12, 5],
[ 9, 8, 7, 6]
]
如果不考虑边界条件运行以下代码:
# test_case = [
# [1, 2, 3, 4],
# [12, 13, 14, 5],
# [11, 16, 15, 6],
# [10, 9, 8, 7]
# ]
test_case = [
[1, 2, 3, 4],
[10,11,12, 5],
[ 9, 8, 7, 6]
]
def spiralTraverse(array):
result = []
start_row, end_row = 0, len(array)-1
start_col,end_col = 0, len(array[0])-1
while start_row <= end_row and start_col <= end_col:
print("------>")
for col in range(start_col,end_col+1):
result.append(array[start_row][col])
print(f"current result: {result}")
print("vvvvvvv")
for row in range(start_row+1, end_row+1):
result.append(array[row][end_col])
print(f"current result: {result}")
print("<<<<<<<")
for col in reversed(range(start_col,end_col)):
# if start_row == end_row:
# break
result.append(array[end_row][col])
print(f"current result: {result}")
print("^^^^^^^")
for row in reversed(range(start_row+1,end_row)):
# if start_col == end_col:
# break
result.append(array[row][start_col])
print(f"current result: {result}")
start_row += 1
end_row -= 1
start_col += 1
end_col -= 1
return result
### Time: O(n)
### Space: O(n)
print(spiralTraverse(array = test_case))
print("test range")
for _ in range(1,1):
print(_)
会得到的输出为:
------>
current result: [1, 2, 3, 4]
vvvvvvv
current result: [1, 2, 3, 4, 5, 6]
<<<<<<<
current result: [1, 2, 3, 4, 5, 6, 7, 8, 9]
^^^^^^^
current result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
------>
current result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
vvvvvvv
current result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
<<<<<<<
current result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 11]
^^^^^^^
current result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 11]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 11]
test range
[Finished in 0.6s]
也就是结果为[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 11], 多了一个11
完整solution:
test_case = [
[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]
]
def spiralTraverse(array):
result = []
start_row, end_row = 0, len(array)-1
start_col,end_col = 0, len(array[0])-1
while start_row <= end_row and start_col <= end_col:
for col in range(start_col,end_col+1):
result.append(array[start_row][col])
for row in range(start_row+1, end_row+1):
result.append(array[row][end_col])
for col in reversed(range(start_col,end_col)):
if start_row == end_row:
break
result.append(array[end_row][col])
for row in reversed(range(start_row+1,end_row)):
if start_col == end_col:
break
result.append(array[row][start_col])
start_row += 1
end_row -= 1
start_col += 1
end_col -= 1
return result
### Time: O(n)
### Space: O(n)
print(spiralTraverse(array = test_case))