leetcode 47 包含重复的全排列

思路:

和基础版的全排列很像。关键在于:需要判断同样值的元素在当次递归的for循环中是否已经处理过,如果已经处理过,则忽略。这里选择用map来记录。

 1 class Solution {
 2     private List<List<Integer>> ans = new ArrayList<>();
 3     public List<List<Integer>> permuteUnique(int[] nums) {
 4         ans.clear();
 5         if (nums == null || nums.length == 0) {
 6             return ans;
 7         }
 8         int n = nums.length;
 9         helper(nums, new ArrayList<Integer>(), 0, n);
10         return ans;
11     }
12
13     public void helper(int[] nums, List<Integer> tmp, int k, int n) {
14         if (k == n) {
15             ans.add(new ArrayList<Integer>(tmp));
16             return;
17         }
18
19         Map<Integer, Boolean> isVisit = new HashMap<>();
20         for (int i = k; i < n; i++) {
21             if (!isVisit.containsKey(nums[i])) {
22                 tmp.add(nums[i]);
23                 swap(nums, k, i);
24                 helper(nums, tmp, k + 1, n);
25                 swap(nums, k, i);
26                 tmp.remove(tmp.size() - 1);
27                 isVisit.put(nums[i], true);
28             }
29         }
30     }
31
32     public void swap(int[] nums, int i, int j) {
33         int tmp = nums[i];
34         nums[i] = nums[j];
35         nums[j] = tmp;
36         return;
37     }
38 }

其他的没什么好说的,都是模式化的东西。

原文地址:https://www.cnblogs.com/hiyashinsu/p/10727354.html

时间: 2024-11-13 01:09:00

leetcode 47 包含重复的全排列的相关文章

LeetCode 47 Permutations II(全排列)

题目链接: https://leetcode.com/problems/permutations-ii/?tab=Description 给出数组,数组中的元素可能有重复,求出所有的全排列 使用递归算法: 传递参数 List<List<Integer>> list, List<Integer> tempList, int[] nums, boolean[] used 其中list保存最终结果 tempList保存其中一个全排列组合 nums保存初始的数组 used随着计

LeetCode 219. Contains Duplicate II (包含重复项之二)

Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most k. 题目标签:Array, Hash Table 题目给了我们一个nums array 和一个 k, 让

LeetCode 47. 全排列 II(Permutations II)

题目描述 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解题思路 类似于LeetCode46.全排列,只不过对于每个起始位置维护一个之前遍历过的数集,在交换时判断当前数是否在数集中出现,若出现过则不能交换此数,否则与起始位置交换并将此数加入到数集中. 代码 1 class Solution { 2 public: 3 vector<vector<int>> permuteU

LeetCode 47 全排列II

题目: 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解题思路: 与上一题相比,这题多了一个无重复条件.那即在上一题的基础上加上去重处理即可. 去重办法: 首先,为了判别存在重复的数字,我们可以让重复的数字紧靠在一起,这样就可以用 if(nums[i] == nums[i-1]) 这样的方法来判重.那怎么让重复的数字紧靠在一起呢? 使用sort从小到大排序. 然后,使用上述的判重语句,并

[LeetCode] Contains Duplicate II 包含重复值之二

Given an array of integers and an integer k, return true if and only if there are two distinct indices i and j in the array such that nums[i] = nums[j] and the difference between i and j is at most k. 这道题是之前那道Contains Duplicate 包含重复值的延伸,不同之处在于那道题只要我们

从n个元素中选择k个的所有组合(包含重复元素)

LeetCode:Combinations这篇博客中给出了不包含重复元素求组合的5种解法.我们在这些解法的基础上修改以支持包含重复元素的情况.对于这种情况,首先肯定要对数组排序,以下不再强调 修改算法1:按照求包含重复元素集合子集的方法LeetCode:Subsets II算法1的解释,我们知道:若当前处理的元素如果在前面出现过m次,那么只有当前组合中包含m个该元素时,才把当前元素加入组合 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

LeetCode:存在重复元素【217】

LeetCode:存在重复元素[217] 题目描述 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 示例 1: 输入: [1,2,3,1] 输出: true 示例 2: 输入: [1,2,3,4] 输出: false 示例 3: 输入: [1,1,1,3,3,4,3,2,4,2] 输出: true 题目分析 对于数据结构HashSet, 我们首先需要知道的是HashSet是不包含重复元素的,其次是存储

一个有序数组(包含重复的),去除重复的数字然后输出

问题: 一个有序数组,其中包含重复的元素,去除重复的数字然后输出: 解决: 1.用指针比较方便,这里用数组下标来解决吧: 2.tmp类似指针指向不重复元素的最后一位: 3.num类似指针指向删除重复元素后的数组的最后一位: 代码如下: #include <stdio.h> #include <stdlib.h> int A[] = {1,2,2,4,5,5,5,5,8,9,10,10}; void fun(int inp[],int size) { int i=1,tmp=inp[

【LeetCode-面试算法经典-Java实现】【219-Contains Duplicate II(包含重复元素II)】

[219-Contains Duplicate II(包含重复元素II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun-Chao] 原题 Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = n