1. 程式人生 > 實用技巧 >DFS_47. 全排列 II

DFS_47. 全排列 II

給定一個可包含重複數字的序列,返回所有不重複的全排列。

示例:

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

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


思路:

上一題是沒有重複的數字,這題數字允許重複

總的思路和上一題一樣,增加一個條件判斷,判斷當前形成的路徑和上一條路徑是不是相同的

class Solution {
    public List<List<Integer>> permuteUnique(int[] nums) {
        
//特殊情況判斷 List<List<Integer>> res = new LinkedList(); if (nums == null || nums.length == 0){ return res; } boolean [] isVisited = new boolean[nums.length]; Deque<Integer> path = new ArrayDeque<Integer>(); dfs(nums,0,path,res,isVisited);
return res; } private void dfs(int[] nums, int depth, Deque<Integer> path, List<List<Integer>> res, boolean[] isVisited) { if (depth == nums.length){ res.add(new ArrayList<>(path)); return; } for (int i = 0; i < nums.length; i++) {
if (i != 0 && nums[i] == nums[i - 1] && !isVisited[i - 1]) { continue; // 防止重複 } if (isVisited[i]){ continue; } isVisited[i] = true; path.add(nums[i]); dfs(nums,depth + 1,path,res,isVisited); path.remove(nums[i]); isVisited[i] = false; } } }