当前位置: 首页 > news >正文

LeetCode 剑指 Offer II 079. 所有子集

给定一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

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

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同

解法一:如果输入数组大小为n,则子集数量为2n^nn,我们可以从0循环到2n^nn-1,对于循环到的每个数字i,其中二进制位为1的位对应输入数组中的元素加入到当前子集中:

class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {int sz = nums.size();int subSetsNum = pow(2, sz);vector<vector<int>> ans;for (int i = 0; i < subSetsNum; ++i) {vector<int> cur;for (int j = 0; j < sz; ++j) {if ((1 << j) & i) {cur.push_back(nums[j]);} }ans.push_back(cur);}return ans;}
};

如果输入数组大小为n,此算法时间复杂度为O(n*2n^nn),空间复杂度为O(n)。

解法二:递归处理,每处理到一个元素时,有两种处理方法,将其加入子集或不加入子集:

class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> ans;vector<int> current;recursion(0, nums, current, ans);return ans;}private:void recursion(int pos, vector<int> &nums, vector<int> &current, vector<vector<int>> &ans) {int sz = nums.size();if (pos == sz) {ans.push_back(current);return;}// 不加当前位置元素recursion(pos + 1, nums, current, ans);// 加当前位置元素current.push_back(nums[pos]);recursion(pos + 1, nums, current, ans);current.pop_back();}
};

如果输入数组大小为n,此算法时间复杂度为O(n*2n^nn),一共有2n^nn种子集,每种需要O(n)的时间加入结果数组ans,空间复杂度为O(n),主要是栈空间开销和current数组开销。

http://www.lryc.cn/news/29009.html

相关文章:

  • 打印名片-课后程序(Python程序开发案例教程-黑马程序员编著-第二章-课后作业)
  • 为什么我们在判断字符串不为null后还要判断字符串长度大于0?
  • javaEE 初阶 — 应用层中的 DNS 协议(域名解析系统)
  • 【网络】-- 网络编程套接字(铺垫、预备)
  • 一文打通@SentinelResource
  • 苹果手机备份的文件在电脑什么地方 苹果备份文件怎么查看
  • 【MySQL速通篇001】5000字超详细介绍MySQL部分重要知识点
  • 并发编程——synchronized优化原理
  • LeetCode 剑指 Offer II 083. 没有重复元素集合的全排列
  • JSONObject与JSONArray使用区别
  • 经典C程序例程:通过进程ID得到文件名
  • 【Java】Spring MVC程序开发
  • leetcode题解-704. 二分查找
  • 2.2 C语言程序的错误条件
  • laravel 邮件发送
  • 高性能 Jsonpath 框架,Snack3 3.2.57 发布
  • Android---进程间通信机制3
  • Python实战,爬取金融期货数据
  • Allegro如何导入第三方网表操作指导
  • 高码率QPSK调制解调方案(FPGA实现篇)
  • Elasticsearch的RESTful Api使用
  • 软著申请需要注意的
  • SpringBoot入门 - 添加Logback日志
  • 社会实践报告
  • LeetCode 460. LFU 缓存 -- 哈希查询+双向链表
  • Dubbo 源码分析 – SPI 机制
  • JDBC概述二(JDBC编程+案例展示)
  • 广度和深度优先搜索解析与示例代码
  • 基于SLIC超像素的归一化分割算法
  • C语言刷题(4)——“C”