Перестановка может быть решена в типичном Backtrack алгоритме, в котором мы должны пройти все возможности в пространстве состояний .Возврат является очень важным алгоритмом, и я предлагаю вам взглянуть на него (который обычно находится в форме рекурсии) и попытаться освоить его основную идею, а не пытаться решить проблему перестановки по-своему.
В основном, чтобы найти перестановку, мы должны пройти n шагов (установка одного бита - это один шаг), после того как мы выбрали один бит для каждого шага, у нас есть перестановка, поэтому у нас есть одно возможное решение (скажем, это 1,2,3,4,5,6
).После этого мы возвращаемся ко второму последнему биту, отметим, что мы выбрали 5
в нашем первом решении, но у нас может быть другой выбор 6
, после этого у нас есть только один выбор для последнего бита, который равен 5
.Для других решений мы продолжаем возвращаться к третьему последнему биту, четвертому последнему биту ... и так далее.По этой причине имя возврата возвращается.
Вы можете сравнить возврат с DFS или алгоритмом перемещения в двоичном дереве.Во многих местах они очень похожи друг на друга.
Ниже приведено мое решение этой проблемы, в которой результатом является arrayList, а перестановка задается в соответствии с 1...n
вместо 0...n-1
, номысль в нем точно такая же.
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> permutations=new ArrayList();
backtrack(permutations,new ArrayList<Integer>(),nums);
return permutations;
}
private void backtrack(List<List<Integer>> permutations,List<Integer> tempList,int[] nums){
if(tempList.size()==nums.length){
permutations.add(new ArrayList<Integer>(tempList));
return;
}
for(int i=0;i<nums.length;i++){
if(tempList.contains(nums[i])){
continue;
}
tempList.add(nums[i]);
backtrack(permutations,tempList,nums);
tempList.remove(tempList.size()-1);
}
}
}