46.全排列
描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
实例
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
题解
- 所有的排列方式都可以通过交换元素的值来获得
- 每一个循环中都在修改
changeIndex
的值,然后进入下一轮迭代 - 迭代时,
changeIndex-1
位置的值已经被确定 - 当这一条线结束时需要将
nums
恢复为初始的状态
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new LinkedList<>();
getAllPoss(nums,0,result);
return result;
}
public void getAllPoss(int[] nowState,int changeIndex,List<List<Integer>> result){
if (changeIndex == nowState.length){
List<Integer> nowList = new LinkedList<>();
for(int e:nowState){
nowList.add(e);
}
result.add(nowList);
return;
}
for (int i = changeIndex; i < nowState.length; i++) {
swap(i,changeIndex,nowState);
getAllPoss(nowState,changeIndex+1,result);
swap(i,changeIndex,nowState);
}
}
public void swap(int i,int j,int[] nums){
if (i == j)
return;
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}