【Python3】剑指 Offer 12. 矩阵中的路径

刚开始用Python刷题,记录一个踩坑
题目传送门
思路很简单,dfs+回溯,这里在用Python创建二维数组的时候,使用乘法直接创建,导致浅拷贝,在后续使用visited数组的时候出现了错误。

class Solution:
    def dfs(self, board: List[List[str]], word: str, x: int, y: int, idx: int, vis) -> bool:
        # idx: next index to match
        if x >= 0 and y >= 0 and x < len(board) and y < len(board[0]) and vis[x][y] == False:
            if board[x][y] != word[idx]:
                return False
            
            if idx == len(word) - 1:
                return True

            vis[x][y] = True
            
            for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
                if self.dfs(board, word, x+dx, y+dy, idx+1, vis):
                    return True
            
            vis[x][y] = False
        return False

    def exist(self, board: List[List[str]], word: str) -> bool:
        # vis = [False] * len(board[0])
        # vis = [vis] * len(board)
        vis = [[False for i in range(len(board[0])) ] for j in range(len(board))]
        for i in range(len(board)):
            for j in range(len(board[0])):
                if self.dfs(board, word, i, j, 0, vis):
                    return True
        return False

使用注释部分的方法进行浅拷贝创建数组会出现错误,如下一个简单例子:

# 创建二维的bool数组
vis = [ False ] * 2
vis = [ vis ] * 3
vis
'''
output: [
[False, False], 
[False, False], 
[False, False]]
'''

# 赋值修改
vis[0][0] = True
vis
'''
output: [
[True, False], 
[True, False], 
[True, False]
]
'''

在进行修改操作的时候,y索引为0的一列都被修改了,这里属于创建了一个浅拷贝的数组,下面来看一下这个浅拷贝的变量地址:

# 创建二维的bool数组,内置函数id()返回变量的十进制地址位置
vis = [ False ] * 2
vis = [ vis ] * 3
# 输出每个元素的地址
for i in range(len(vis)):
	for j in range(len(vis[0])):
		print(f'[{i}][{j}]:{id(vis[i][j])}')
# 每个元素指向了同一个地址
'''
>>>
[0][0]:4303327472
[0][1]:4303327472
[1][0]:4303327472
[1][1]:4303327472
[2][0]:4303327472
[2][1]:4303327472
'''
# 赋值修改,之后再输出地址
vis[0][0] = True
'''
>>>
[0][0]:4303326744
[0][1]:4303327472
[1][0]:4303326744
[1][1]:4303327472
[2][0]:4303326744
[2][1]:4303327472
'''

发现修改的时候导致所有y索引0的元素都被修改了,这里对应的三个元素是创建数组的时候第二次的*3,修改的时候只能修改内层变量变化,而二次浅拷贝所有的引用此时也跟着变化了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值