python-数组-spiral_traverse-螺旋遍历二维数组

输入一个二维数组,并对这个数组进行螺旋遍历

样例输入

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))

Time: O(n)

Space: O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值