90. 子集 II

题目地址


  • 题目描述:

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

  • 示例 1:
输入:nums = [1,2,2] 输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
  • 示例 2:
输入:nums = [0] 输出:[[],[0]]
  • 提示:
1 <= nums.length <= 10 -10 <= nums[i] <= 10

题解:

  • 回溯法
class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); Set<List<Integer>> ans = new HashSet<>(); List<Integer> cur = new ArrayList<>(); dfs(nums, 0, cur, ans); return new ArrayList<>(ans); } /** * @param nums 原输入数组 * @param u 当前决策到原输入数组中的哪一位 * @param cur 当前方案 * @param ans 最终结果集 */ void dfs(int[] nums, int u, List<Integer> cur, Set<List<Integer>> ans) { // 所有位置都决策完成,将当前方案放入结果集 if (nums.length == u) { ans.add(new ArrayList<>(cur)); return; } // 选择当前位置的元素,往下决策 cur.add(nums[u]); dfs(nums, u + 1, cur, ans); // 不选当前位置的元素(回溯),往下决策 cur.remove(cur.size() - 1); dfs(nums, u + 1, cur, ans); } }

时间复杂度:排序时间O(nlogn),爆搜复杂度为O(2n),每个方案通过深拷贝存入答案,为O(n),整体时间复杂度为O(n×2n)
空间复杂度:总共有2n个方案,每个方案最多占用O(n)空间,整体为(n×2n)

  • 状态压缩
class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); int n = nums.length; Set<List<Integer>> ans = new HashSet<>(); List<Integer> cur = new ArrayList<>(); // 枚举 i 代表,枚举所有的选择方案状态 // 例如 [1,2],我们有 []、[1]、[2]、[1,2] 几种方案,分别对应了 00、10、01、11 几种状态 for (int i = 0; i < (1 << n); i++) { cur.clear(); // 对当前状态进行诸位检查,如果当前状态为 1 代表被选择,加入当前方案中 for (int j = 0; j < n; j++) { int t = (i >> j) & 1; if (t == 1) cur.add(nums[j]); } // 将当前方案中加入结果集 ans.add(new ArrayList<>(cur)); } return new ArrayList<>(ans); } }

__EOF__

本文作者stone
本文链接https://www.cnblogs.com/qscgy/p/14604489.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zko  阅读(61)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示