题目要求:
我对递归和回溯问题根本就没有很好的理解,只知道要这么做,但是不知道为什么要这么做,所以具体看了一下大牛们写的博客:
回溯算法超通俗易懂详尽分析和例题
这一篇开始写得蛮好的
还有一个是:
怎么更好地终极理解递归算法
这一篇把概念讲得非常详细
分析:
这道题目用的是递归 + 回溯
递归递归,这两个字是拆分开来看的,在我们这道题目中,是有递也有归。
其过程大致如下图所示:
- 首先我们对nums进行遍历,为了不重复,我们就要首先要对其重复性进行判断,一旦出现相同的数字,就直接扼杀掉;
- 然后再进行递归,在递归不下去的时候,进行回溯。
具体代码如下:
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> resultList = new ArrayList<>();
List<Integer> result = new ArrayList<>();
recursion(resultList,result,nums);
return resultList;
}
public void recursion(List<List<Integer>> resultList,List<Integer> result,int[] nums){
if(result.size()==nums.length){
resultList.add(new ArrayList<>(result));
}else{
for(int i=0;i<nums.length;i++){
if(result.contains(nums[i])){
continue;
}else{
result.add(nums[i]);
recursion(resultList,result,nums);
result.remove(result.size()-1);
}
}
}
}
}