回溯法3,排列
阿新 • • 發佈:2020-10-20
一.題源
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 8public 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陣列來標記訪問過的元素,也可以使用別的方式。