1. 程式人生 > 實用技巧 >回溯法3,排列

回溯法3,排列

一.題源

  https://www.lintcode.com/problem/permutations/description

  https://leetcode-cn.com/problems/permutations/

二.程式碼

 1 public class Solution {
 2     public static void main(String[] args) {
 3         int[] arr = new int[]{1,2,3};
 4 
 5         ArrayUtils.displayArrayList(permute(arr));
 6     }
 7 
 8
public static List<List<Integer>> permute(int[] nums) { 9 List<List<Integer>> result = new ArrayList<>(); 10 11 boolean[] used = new boolean[nums.length]; 12 backTrace(result,new ArrayList<>(),nums,used); 13 14 return result;
15 } 16 17 private static void backTrace(List<List<Integer>> result,List<Integer> list,int[] nums,boolean[] used){ 18 if (list.size()==nums.length){ 19 result.add(new ArrayList<>(list)); 20 return; 21 } 22 23 for (int i = 0; i < nums.length; i++) {
24 if(used[i]){ 25 continue; 26 } 27 list.add(nums[i]); 28 used[i] = true; 29 backTrace(result,list,nums,used); 30 list.remove(list.size()-1); 31 used[i] = false; 32 } 33 } 34 }

輸出

[
    [1,2,3],
    [1,3,2],
    [2,1,3],
    [2,3,1],
    [3,1,2],
    [3,2,1]
]

  

三.圖解分析

四.總結

  基本思路是,遍歷列出所有的情況,包括重複的,然後設定好排除條件,如已經訪問過的數字,就過濾掉,不讓加入解集中去。

   關鍵點:就是設定好排除條件,比如上題中使用了used陣列來標記訪問過的元素,也可以使用別的方式。