1. 程式人生 > >LeetCode:全排列【46】

LeetCode:全排列【46】

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);
      }
   }
}