1. 程式人生 > 其它 >leecode no.46 全排列

leecode no.46 全排列

package leecode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* 46. 全排列
*
* 給定一個不含重複數字的陣列 nums ,返回其 所有可能的全排列 。你可以 按任意順序 返回答案。
*
* @author Tang
* @date 2021/12/8
*/
public class Permute {

List<List<Integer>> result = new ArrayList<>();

int[] nums;

/**
* 回溯演算法
* 1.已選路徑
* 2.可選列表
* 3.結束條件
*
* 迴圈遍歷{
* 遞迴之前做出選擇
* 執行遞迴()
* 遞迴之後撤銷選擇
* }
*
*
* @param nums
* @return
*/
public List<List<Integer>> permute(int[] nums) {
this.nums = nums;

//已選列表
List<Integer> hasChooseList = new ArrayList<>();
track(hasChooseList);
return result;
}

/**
* 遞迴
*/
private void track(List<Integer> hasChooseList) {
//完成一次排列 更新結果
if(hasChooseList.size() == nums.length) {
Object[] array = hasChooseList.toArray();
List list = Arrays.asList(Arrays.copyOf(array, array.length));
result.add(list);
return;
}


//找出nums中沒有的元素
for (int num : nums) {
if(hasChooseList.contains(num)) {
continue;
}

//遞迴之前做出選擇 num
hasChooseList.add(num);

//執行遞迴
track(hasChooseList);

//遞迴之後撤銷選擇
hasChooseList.remove((Integer) num);
}


}

public static void main(String[] args) {

}

}