【发布时间】:2021-09-22 05:56:27
【问题描述】:
以上是问题。它是找到给定整数数组中的所有排列(所有 unqiue)
实际问题
我正在尝试检查蛮力方法置换方法(不是在寻找最佳解决方案)。我发现自己陷入了这个特殊的问题。 用于存储每次递归调用更改的排列的结果数组。我无法理解为什么会这样。需要帮助解决。
出于调试目的,我已包含来自代码不同位置的 print()。如果您需要任何其他信息来帮助您找到答案,请告诉我。
算法演练
element_map -> 在这种情况下为输入数组 [False,False,False] 的每个位置存储 False temp_result -> 在每个步骤中存储临时排列
- permutation function 迭代输入数组的每个 val 并将排列存储在 temp_result 数组中。
- 将元素添加到 temp_result 后,它会将 element_map 标记为 True 并再次递归调用 置换函数。
- 如果 len(temp_result) == len(nums),则递归结束。在这种情况下,我们得到一个排列并将其添加到结果中。
- 一旦遇到基本情况 3,我们设置 element_map[i] = False 并从 temp_result 弹出最后一个 val
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
if len(nums) == 1:
return [nums]
result = []
element_map = defaultdict(bool)
for i in range(len(nums)):
element_map[i] = False
def permutations(nums, temp_result, element_map):
nonlocal result
print("Start result ->", result)
print("Start temp_result ->", temp_result)
if len(temp_result) == len(nums):
result.append(temp_result)
print(len(temp_result),len(nums))
print("temp_result ->", temp_result)
print("result-> ",result)
return
for i,val in enumerate(nums):
if not element_map[i]:
element_map[i] = True
temp_result.append(val)
permutations(nums, temp_result, element_map)
temp_result.pop()
element_map[i] = False
temp_result = []
permutations(nums, temp_result, element_map)
print(result)
输入 [1,2,3] 的代码输出。问题是结果不断变化。
Start result -> []
Start temp_result -> []
Start result -> []
Start temp_result -> [1]
Start result -> []
Start temp_result -> [1, 2]
Start result -> []
Start temp_result -> [1, 2, 3]
3 3
temp_result -> [1, 2, 3]
result-> [[1, 2, 3]]
Start result -> [[1, 3]]
Start temp_result -> [1, 3]
Start result -> [[1, 3, 2]]
Start temp_result -> [1, 3, 2]
3 3
temp_result -> [1, 3, 2]
result-> [[1, 3, 2], [1, 3, 2]]
Start result -> [[2], [2]]
Start temp_result -> [2]
Start result -> [[2, 1], [2, 1]]
Start temp_result -> [2, 1]
Start result -> [[2, 1, 3], [2, 1, 3]]
Start temp_result -> [2, 1, 3]
3 3
temp_result -> [2, 1, 3]
result-> [[2, 1, 3], [2, 1, 3], [2, 1, 3]]
Start result -> [[2, 3], [2, 3], [2, 3]]
Start temp_result -> [2, 3]
Start result -> [[2, 3, 1], [2, 3, 1], [2, 3, 1]]
Start temp_result -> [2, 3, 1]
3 3
temp_result -> [2, 3, 1]
result-> [[2, 3, 1], [2, 3, 1], [2, 3, 1], [2, 3, 1]]
Start result -> [[3], [3], [3], [3]]
Start temp_result -> [3]
Start result -> [[3, 1], [3, 1], [3, 1], [3, 1]]
Start temp_result -> [3, 1]
Start result -> [[3, 1, 2], [3, 1, 2], [3, 1, 2], [3, 1, 2]]
Start temp_result -> [3, 1, 2]
3 3
temp_result -> [3, 1, 2]
result-> [[3, 1, 2], [3, 1, 2], [3, 1, 2], [3, 1, 2], [3, 1, 2]]
Start result -> [[3, 2], [3, 2], [3, 2], [3, 2], [3, 2]]
Start temp_result -> [3, 2]
Start result -> [[3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1]]
Start temp_result -> [3, 2, 1]
3 3
temp_result -> [3, 2, 1]
result-> [[3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1]]
[[],[],[],[],[],[]]
【问题讨论】:
-
@oskros 谢谢。不能解决我的问题,但很好读。
-
当然,它不能解决您的代码问题。但是该功能可以更轻松地解决它,并且对其工作原理进行了解释。你可以简单地做某事像
list(map(list, itertools.permutations([1,2,3])))
标签: python python-3.x recursion