问题描述:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,[1,1,2]
have the following unique permutations:[1,1,2]
, [1,2,1]
, and [2,1,1]
.
原问题链接:https://leetcode.com/problems/permutations-ii/
问题分析
这个问题其实和前面的那个问题差不多,不过是一个针对有重复元素的情况进行处理,需要去掉那些重复的记录。在之前的文章里也对这种情况进行了分析。我们可以用递归的方式来实现,不过这种方式相对来说稍微复杂了一点,而且效率也不高。最有意思的地方是我们前面列举的字典序方法是可以处理重复元素的情况,它可以保证返回的元素集合已经去除了重复的情况。所以说,把前面的代码直接搬过来就可以了:
public class Solution { public List<List<Integer>> permuteUnique(int[] num) { Arrays.sort(num); List<List<Integer>> lists = new ArrayList<List<Integer>>(); lists.add(appendList(num)); while(true) { int start = findStart(num); if(start == -1) break; int end = findEnd(num, start); if(end == -1) break; swap(num, start, end); reverse(num, start + 1, num.length - 1); lists.add(appendList(num)); } return lists; } private List<Integer> appendList(int[] num) { List<Integer> list = new ArrayList<Integer>(); for(int i = 0; i < num.length; i++) list.add(num[i]); return list; } private int findStart(int[] num) { for(int i = num.length - 2; i >= 0; i--) if(num[i] < num[i + 1]) return i; return -1; } private int findEnd(int[] num, int l) { for(int i = num.length - 1; i > l; i--) if(num[i] > num[l]) return i; return -1; } private void reverse(int[] num, int l, int r) { while(l < r) { swap(num, l, r); l++; r--; } } private void swap(int[] num, int i, int j) { int temp = num[i]; num[i] = num[j]; num[j] = temp; } }
为什么这种方式可以处理重复元素的情况呢?因为我们之前的字典序构造里,是针对元素排列的递增和递减情况来处理的。针对相等元素的情况则直接跳过去了。具体的细节可以看前面文章里的分析。
相关推荐
6. **回溯**:如“全排列”(Permutations),使用回溯算法找出所有可能的排列组合。 在阅读和学习这些解决方案时,你可以深入了解每种数据结构和算法的工作原理,并学习如何在 TypeScript 中有效地实现它们。同时...
permutations2.py - 返回所有可能的唯一排列 3sum_2.py - 查找数组中所有唯一的三元组,其总和为零。 3sum.py - 查找数组中所有唯一的三元组,其总和为零。 first_last_pos_array.py - 找到给定目标值的开始和结束...
leetcode 轮廓 1_count_and_say.cpp - super_ugly_number.cpp - Detect_Pattern.cpp - degree_of_array.cpp - 键盘.cpp - 2Sum_Data_Structure_Design.cpp - shuffle_array.cpp - permutations.cpp - kth_missing_...
例如,`itertools.permutations()`和`itertools.combinations()`可以高效地生成排列和组合。 最后,Python的`unittest`模块是进行单元测试的好工具,可以在本地验证LeetCode问题的解决方案是否正确。通过编写测试...
6. **回溯**:回溯是一种尝试所有可能解的算法策略,常见于解决组合优化问题,如"全排列"(Permutations)和"N皇后问题"(N-Queens)。 7. **动态规划**:动态规划是一种解决最优化问题的方法,通过构建状态转移...
6. **回溯法**:如“全排列”(Permutations),要求列出所有可能的数组排列。 7. **堆和队列**:如“最小覆盖子集”(Minimum Size Subarray Sum),需要找到使数组元素和大于等于给定目标的最小子数组长度。 每个...
permutations import random import itertools import collections from fractions import Fraction from collections import Counter import operator import re from functools import reduce from collections ...
II 其他变种 编程之美 Preorder Traversal Inorder Traver sal postorder 非递归 不用栈! 字符串常用操作 字符串 各种转换 Pow(x,n) 优化 Permutations (交换 取子集两种方式) Trie树 11 中序遍历 无堆栈 (前序 ...
例如,`itertools`模块中的`combinations`和`permutations`可以帮助我们进行组合和排列的计算;`heapq`模块则提供了优先队列,对于解决最小堆问题十分便捷。 在LeetCode中,Python的内置函数如`map`、`filter`、`...
leetcode怎么计算空间复杂度是指 LeetCode-Solution my first solution of LeetCode 2015-5-7 Problem 95,98(80 already!) 我经常在递归的结束地方忘记return!!! 题型一:经典暴力递归:(里面涉及到重复不重复的...
8. **回溯**:回溯法常用于解决排列组合问题,如"全排列"(Permutations),需要生成所有可能的排列组合。 9. **动态规划**:动态规划是解决复杂问题的有效方法,如"背包问题"(Knapsack Problem),通过状态转移...
3. **Python标准库**:如`collections`中的`deque`(双端队列)可用于BFS,`itertools`中的`combinations`或`permutations`可以用于生成所有可能的解决方案。此外,`heapq`模块可用于优先队列,这对于解决某些优化...
c语言入门 C语言_leetcode题解之47-permutations-ii.c
js js_leetcode题解之47-permutations-ii.js
leetcode怎么销号 LeetCode-Solutions :green_heart:My own LeetCode solutions No. Problem LeetCode 力扣 Python Go Solution Difficulty Tag 0017 Letter Combinations of a Phone Number Medium 回溯、暴力 0034...
Source file for LeetCode Permutations Problem
- 使用`itertools`模块提供的工具函数,如`combinations()`, `permutations()`等,处理组合和排列问题。 - 应用动态规划、贪心算法、回溯法等算法思想,解决复杂问题。 4. **'leetcode2-master'项目**: - '...
c语言入门 C语言_leetcode题解之46-permutations.c
js js_leetcode题解之46-permutations.js