给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1] 输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
思路:还是使用回溯解决的题,既然是回溯题,先把回溯的模板摆上!然后考虑if终止条件和for循环。
这道题是排列类型的题,和之前的组合类型的题又不一样了。在排列中[1,2]和[2,1]是不同的,但在组合里他们是一样的。
关于if终止条件:排列是对数组里面的所有数字排顺序,当nums中所有的数字按某种顺序放入path里面,就视为完成一次排列,故终止条件是path的长度等于nums的长度。
关于for循环:排列是对数组里面的所有数字排顺序,故每次的范围都是从第一个元素到数组末尾元素,那怎么排顺序呢,这里使用一个used数组,长度等于nums,起初used数组元素全为0,表示没有数字被使用过,后面每当一个数字被使用,就把这个数字对应used的下标改为1,后面每次循环,只有当这个数字没被使用过才加入path。
代码(python):
class Solution(object):
def permute(self, nums):
result = []
path = []
used = [0] * len(nums) #记录元素是否使用过
def backtracking(used):
if len(path) == len(nums): #若完成一次排列,放入result中
result.append(path[:])
return
for i in range(0,len(nums)):
if used[i] == 1: #若该元素使用过,跳过
continue
used[i] = 1
path.append(nums[i])
backtracking(used)
path.pop()
used[i] = 0
backtracking(used)
return result