Java教程

47. 全排列 II

本文主要是介绍47. 全排列 II,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

描述

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

 

链接

47. 全排列 II - 力扣(LeetCode) (leetcode-cn.com)

 

解法

 1 class Solution {
 2     //存放结果
 3     List<List<Integer>> result = new ArrayList<>();
 4     //暂存结果
 5     List<Integer> path = new ArrayList<>();
 6 
 7     public List<List<Integer>> permuteUnique(int[] nums) {
 8         boolean[] used = new boolean[nums.length];
 9         Arrays.fill(used, false);
10         Arrays.sort(nums);
11         backTrack(nums, used);
12         return result;
13     }
14 
15     private void backTrack(int[] nums, boolean[] used) {
16         if (path.size() == nums.length) {
17             result.add(new ArrayList<>(path));
18             return;
19         }
20         for (int i = 0; i < nums.length; i++) {
21             // used[i - 1] == true,说明同⼀树⽀nums[i - 1]使⽤过
22             // used[i - 1] == false,说明同⼀树层nums[i - 1]使⽤过
23             // 如果同⼀树层nums[i - 1]使⽤过则直接跳过
24             if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
25                 continue;
26             }
27             //如果同⼀树⽀nums[i]没使⽤过开始处理
28             if (used[i] == false) {
29                 used[i] = true;//标记同⼀树⽀nums[i]使⽤过,防止同一树支重复使用
30                 path.add(nums[i]);
31                 backTrack(nums, used);
32                 path.remove(path.size() - 1);//回溯,说明同⼀树层nums[i]使⽤过,防止下一树层重复
33                 used[i] = false;//回溯
34             }
35         }
36     }
37 }

 

参考

 Carl

这篇关于47. 全排列 II的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!