1. 程式人生 > >Leetcode---全排列--回溯

Leetcode---全排列--回溯

全排列

題目連結:全排列

思路:
  • 這道題做起來感覺比前面兩篇文章的題目還要簡單 ^ - ^
  • 首先數字的個數我們不清楚,只能使用回溯法逐漸遞迴
  • 第一次有n種選擇,第二次又n-1中……直到僅有一種可選結束
  • 回溯過程中傳遞到下一層時僅需要將當前新增的數字從陣列中剔除即可
  • 由於陣列剔除一個數字比較麻煩,在一開始,我使用List集合複製了陣列
  • 當遞迴達到層數後,將集合新增進結果集時,又需要注意,要重新定義一個List集合,否則僅用一個記憶體,會導致後面的操作將該新增的值覆蓋
程式碼:
	public static List<
List<Integer>> permute(int[] nums) { List<List<Integer>> result = new ArrayList<List<Integer>>(); List<Integer> temp = new ArrayList<Integer>(); List<Integer> list = new ArrayList<Integer>(); for(int n:nums) { list.add(n); } traceback
(list,result,temp); return result; } public static void traceback(List<Integer> nums,List<List<Integer>> result,List<Integer> temp) { if(nums.isEmpty()) { //重新定義集合新增至結果集 List<Integer> temp_list = new ArrayList<Integer>(temp); result.add(temp_list);
return; } for(int i = 0;i<nums.size();i++) { temp.add(nums.get(i)); //剔除nums[i]的陣列 List<Integer> Later_nums = new ArrayList<Integer>(nums); Later_nums.remove(Later_nums.get(i)); traceback(Later_nums,result,temp); //移出新增的數,重新進入迴圈新增下一個數字 temp.remove(nums.get(i)); } }