说起回溯算法,渊源颇深,我上次做过一道,本应该这次能拿下但是,又没拿下,不过这次有点理解它的思想了,
每次的回溯就是一个二叉树,简单的说,就是你执行的操作需要回溯时它会返回调用它的方法哪里的状态,进行下一步的执行。
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> temp = new ArrayList<>(20);
zuhe(temp,0,nums);
return temp;
}
private void zuhe(List<List<Integer>> temp, int n, int[] nums) {
/*
* 每次让其加一个就行了,就空了,
* */
if (nums.length == n) {
List<Integer> integers =new ArrayList<>(20);
for (int r:nums){
integers.add(r);
}
temp.add(integers);
}
for (int i = n, length = nums.length; i <length ; i++) {
change(nums,i,n);
zuhe(temp,n+1,nums);
change(nums,i,n);
}
}
public void change(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
这个需要多练,具体自己体会