LeetCode第46题:Permutations(java实现)
题目描述:
解题答案:
本题可以采用回溯法+递归实现,下面以输入为[1,2,3,]为例,对后面的代码进行一个直观的分析。
tempResult变化情况如下(tempResult为下面代码中的一个变量):
[1]---[1,2]---[1,2,3](添加)---[1,2]---[1]---[1,3]---[1,3,2](添加)---[1,3]---[1]---[]---[2]---[2,1]---[2,1,3](添加)---[2,1]---[2]---[2,3]---[2,3,1](添加)---[2,3]---[2]---[]---[3]---[3,1]---[3,1,2](添加)---[3,1]---[3]---[3,2]---[3,2,1](添加)
下面是代码:
class Solution {
//本题目可以采用回溯法+递归进行求解
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> results=new ArrayList<>();
recursion(results,new ArrayList<>(),nums);
return results;
}
public void recursion(List<List<Integer>> results,List<Integer> tempResult,int[] nums){
//判断:判断tempResult中的数据的长度是否等于nums的长度,如果相等,则相当于这是一个求解答案,添加到答案中
if(tempResult.size()==nums.length){
results.add(new ArrayList<>(tempResult));
}else{//如果不等于nums的长度,说明还没有添加完成
for(int i=0;i<nums.length;i++){
if(tempResult.contains(nums[i])){
continue;
}else{
//添加数据
tempResult.add(nums[i]);
//递归添加数据
recursion(results,tempResult,nums);
//退一步重新一遍跳到下面循环添加新的东西
tempResult.remove(tempResult.size()-1);
}
}
}
}
}
运行结果:
还有一种方法:就是一个一个地插入:
比如首先是[1]-----[2,1],[1,2]------[3,2,1],[2,3,1],[2,1,3],[3,1,2][1,3,2][1,2,3]
下面是Python代码:
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
perms = [[]]
for n in nums:
new_perms = []
for perm in perms:
for i in range(len(perm)+1):
new_perms.append(perm[:i] + [n] + perm[i:])
perms = new_perms
return perms