为何同逻辑的全排列递归代码C++运行正常Python输出全为原数组?
问题原因
Python中列表属于可变对象,你代码里直接执行arr.append(nums)时,实际是把nums的内存引用追加到了结果列表里,没有保存当前时刻的数组值。后续回溯过程中对nums的交换修改会同步影响所有已经追加到arr里的引用值,等递归全部执行完毕时nums会被回溯回初始状态,自然所有结果都和初始输入一致。
C++中追加数组/vector时默认是值拷贝,所以相同逻辑不会出问题。
修复方法
只需要修改追加到结果列表的逻辑,存储当前nums的副本即可:
把arr.append(nums)改为arr.append(nums.copy()) 或者arr.append(nums[:]),两种写法都可以生成当前数组的副本,对整数数组场景足够使用。
修复后完整代码
from typing import List class Solution: def permute(self, nums: List[int]) -> List[List[int]]: arr = [] def per(nums,i): if i == len(nums)-1: # 追加当前数组的副本,避免后续修改影响已存储的结果 arr.append(nums.copy()) return for j in range(i,len(nums)): nums[i],nums[j] = nums[j],nums[i] per(nums,i+1) nums[i],nums[j] = nums[j],nums[i] per(nums,i=0) return arr
内容的提问来源于stack exchange,提问作者Mayank Parashar
相关产品推荐
相关产品推荐

