【一天一大 lee】子集 (难度:中等)-Day20200920
时间:2022-07-25
本文章向大家介绍【一天一大 lee】子集 (难度:中等)-Day20200920,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:[1]
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明: 解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
抛砖引玉
抛砖引玉
递归回溯
使用过递归回溯算法解决过:
- 全排列[2]
- 全排列 II
一句话递归回溯算法的逻辑简要概况就是:
在选择多个原数组的元素组成新成组合时,对于任何一个原数组的元素在新的组合中都可以对其有两种选择形式:当前位置选择或者不选择。
- 本题求一个数组的子集:在递归回溯过程中产生的集合都是数组的子集。
- 解集不能包含重复的子集,递归中需要避免重复的子集出现,维护指针作为递归的层数(或者理解为递归回溯处理了数组元素的指针,指针前为处理过后为未处理)
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
let _result = []
if (nums.length === 0) _result
function helper(index, item) {
if (index === nums.length) {
_result.push([...item])
return
}
item.push(nums[index])
helper(index + 1, item)
// 回溯
item.pop()
helper(index + 1, item)
}
helper(0, [])
return _result
}
位运算解法
从上面的逻辑可以知道,在组成子集时对原数组的元素有选择和不选择两种方式,那么用 0 代码不选择,1 代表选择,那么就可以借助二进制的为元素来枚举子集。
nums = [1,2,3]
二进制 |
子集 |
十进制 |
---|---|---|
000 |
[] |
0 |
001 |
[3] |
1 |
010 |
[2] |
2 |
011 |
[2,3] |
3 |
100 |
[1] |
4 |
101 |
[1,3] |
5 |
110 |
[1,2] |
6 |
111 |
[1,2,3] |
7 |
- 二进制为边界:1 << len(nums 长 len)
- 二进制数遍历时子集的枚举:
- 将 1 按位左移原数组索引为与当前枚举的二进制数逐位取与,大于 0 则说明有重叠位
- 有重叠位则说明,在按照此二进制位枚举时当前索引会被选中
var subsets = function(nums) {
let _result = [],
len = nums.length
for (let i = 0; i < 1 << len; ++i) {
let item = []
for (let j = 0; j < len; ++j) {
if (i & (1 << j)) {
item.push(nums[j])
}
}
_result.push(item)
}
return _result
}
- winform实现拼图游戏
- 一起Polyfill系列:让Date识别ISO 8601日期时间格式
- Oracle 监听器无法启动(TNS-12537,TNS-12560,TNS-00507)
- Javascript Prototypes之旅(A Plain English Guide to JavaScript Prototypes译文)
- Python补充03 Python内置函数清单
- 不懂JQuery的孩子:自封装Ajax函数
- .Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇
- 飓风“桑迪”路径图的制作
- 根据标准word模板生成word文档类库(开源)
- Oracle 监听器无法启动(TNS-12555,TNS-12560,TNS-00525)
- Python补充02 Python小技巧
- 四则运算核心算法(开源)
- 页面分部分加载呈现收集(不断更新中)
- 测试控制鼠标的技巧
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 技术篇-socket套接字实现两个窗口间消息传递,TCP实现
- 解决HttpServletRequest的输入流只能读取一次的问题
- 使用RSA算法对接口参数签名及验签
- 最基础的动态数据结构:链表
- Python 微信机器人-如何查看别人撤回的消息,实战演示!
- Python 技术篇-全局变量引用,local variable referenced before assignment.解决办法
- 线性结构之栈和队列
- pyHook 转码问题-MouseSwitch() missing 8 required positional arguments...,原因及解决办法
- 将Java中的数组进行二次封装成属于我们自己的数组
- Windows 卡进程问题-请等待当前程序完成卸载或更改,轻松解决
- Netty入门之WebSocket初体验
- 如何修复无法启动的docker容器
- Kafka安装(极简版)
- parallelStream的坑,不踩不知道,一踩吓一跳
- leetcode链表之删除链表的节点