LeetCode:全排列【46】
阿新 • • 發佈:2018-11-09
LeetCode:全排列【46】
題目描述
給定一個沒有重複數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
題目分析
首先題目給了一個沒有重複數字的序列,它的全排列也一定不含重複數字。我們採用回溯框架法快速解題。
我們就簡單思考一個問題,每個排列的第一個元素是如何生成的!
我們從左往右,首先我們將1加入tmpList(臨時儲存排列的線性表)中,此後再由它開始產生第二個、第三個數字,最後生成排列儲存在結果中。我們再將1作為第一個元素開始處理後,趕緊把他刪了,再將2加入到tmpList中,此後再有它開始產生第二個、第三個數字,最後生成排列儲存在結果中....
也就是說處理第i個位置的元素時,就要考慮到i位置的所有取值,我們在處理為1的元素後,趕緊把他刪了處理為2的元素.....這樣第i個位置就有所有的情況了。
我覺得這一段講的並不是特別清楚,我只是在講某一層的元素要如何處理,該層要考慮所有元素,就在處理後某個元素後,再把該層騰空,讓給其他元素。
Java題解
public List<List<Integer>> permute(int[] nums) { List<List<Integer>> list = new ArrayList<>(); // Arrays.sort(nums); // not necessary backtrack(list, new ArrayList<>(), nums); return list; } private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){ if(tempList.size() == nums.length){ list.add(new ArrayList<>(tempList)); } else{ for(int i = 0; i < nums.length; i++){ if(tempList.contains(nums[i])) continue; // element already exists, skip tempList.add(nums[i]); backtrack(list, tempList, nums); tempList.remove(tempList.size() - 1); } } }