本文主要是介绍回溯——9.全排列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
力扣题目链接
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
- 输入: [1,2,3]
- 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
解题思路
-
问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成一个完整的排列,然后回溯,尝试其他排列。
-
回溯法流程:
- 依次选择未使用的元素,加入当前排列。
- 当排列长度达到
nums长度时,将当前排列加入结果集。 - 回溯撤销之前的选择,尝试下一个元素,直到遍历完所有可能性。
完整代码如下:
class Solution:def permute(self, nums):result = []self.backtracking(nums, [], [False] * len(nums), result)return resultdef backtracking(self, nums, path, used, result):if len(path) == len(nums):result.append(path[:])returnfor i in range(len(nums)):if used[i]:continueused[i] = Truepath.append(nums[i])self.backtracking(nums, path, used, result)path.pop()used[i] = False
def permute(self, nums):result = []self.backtracking(nums, [], [False] * len(nums), result)return result
- 这个函数是程序的入口。它接收一个整数数组
nums,并返回该数组的所有排列组合。 result是用来保存所有排列的列表。- 调用
self.backtracking(nums, [], [False] * len(nums), result)执行回溯算法来生成所有排列组合。此函数初始化了空路径path和一个与nums等长的布尔数组used,用来标记数组中的某个元素是否已经被使用过。
def backtracking(self, nums, path, used, result):if len(path) == len(nums):result.append(path[:])returnfor i in range(len(nums)):if used[i]:continueused[i] = Truepath.append(nums[i])self.backtracking(nums, path, used, result)path.pop()used[i] = False
- 终止条件:
if len(path) == len(nums): 当path的长度与nums相等时,表示已经找到一个完整的排列,将该排列加入result。
- 循环构建排列:
for i in range(len(nums)): 遍历nums中的每一个元素。if used[i]: continue: 如果nums[i]已经在当前排列中使用过(used[i]为True),跳过这个元素。- 选择一个元素:
used[i] = True: 将nums[i]标记为已使用。path.append(nums[i]): 将nums[i]添加到当前排列中。
- 递归调用:
self.backtracking(nums, path, used, result): 递归调用自己继续构建排列。
- 回溯:
path.pop(): 撤销上一步的选择,回溯到上一个状态。used[i] = False: 将nums[i]标记为未使用,继续尝试其他可能性。
这篇关于回溯——9.全排列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!