1. 程式人生 > 實用技巧 >46. 全排列-dfs回溯-中等難度

46. 全排列-dfs回溯-中等難度

問題描述

給定一個 沒有重複 數字的序列,返回其所有可能的全排列。

示例:

輸入: [1,2,3]
輸出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/permutations

解答

//類似於八皇后那道題。
class Solution {
    List<List<Integer>> list1;
    public void dfs(int[] nums, List<Integer> temp, int
index, int size, int temp_size){ if(index >= size){ if(temp_size == size){ list1.add(new ArrayList<Integer>()); list1.get(list1.size()-1).addAll(temp); temp.remove(temp_size - 1); temp_size--; }
int i = Arrays.binarySearch(nums, temp.get(temp_size - 1)); temp.remove(temp_size - 1); temp_size--; if(i+1 >= size && temp_size == 0)return; dfs(nums, temp, i+1, size, temp_size); } if(index < size){ if(!temp.contains(nums[index])){ temp.add(nums[index]); temp_size
++; dfs(nums, temp, 0, size, temp_size); }else{ dfs(nums, temp, index+1, size, temp_size); } } } public List<List<Integer>> permute(int[] nums) { list1 = new ArrayList<List<Integer>>(); if(nums.length == 0){ list1.add(new ArrayList<Integer>()); return list1; } else if(nums.length == 1){ List<Integer> t = new ArrayList<Integer>(); t.add(nums[0]); list1.add(t); return list1; } Arrays.sort(nums); dfs(nums, new ArrayList<Integer>(), 0, nums.length, 0); return list1; } }