DFS_47. 全排列 II
阿新 • • 發佈:2020-07-24
給定一個可包含重複數字的序列,返回所有不重複的全排列。
示例:
輸入: [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; } } }