LeetCode刷题指南
第 0 章 hot100
0.1 哈希
0.2 双指针
0.3 滑动窗口
0.4 子串
0.5 普通数组
0.6 矩阵
0.7 链表
0.8 二叉树
0.9 图论
0.10 回溯
0.11 二分查找
0.12 栈
0.13 堆
0.14 贪心算法
0.15 动态规划
0.16 多维动态规划
0.17 技巧
第0-1章 面试经典150
0.1 数组/字符串
0.2 双指针
0.3 滑动窗口
链表
二叉树
第 1 章 最易懂的贪心算法
1.1 算法解释
1.2 分配问题
1.3 区间问题
1.4 练习
第 2 章 玩转双指针
2.1 算法解释
2.2 Two Sum
2.3 归并两个有序数组
2.4 滑动窗口
2.5 快慢指针
2.6 练习
第 3 章 居合斩!二分查找
3.1 算法解释
3.2 求开方
3.3 查找区间
3.4 查找峰值
3.5 旋转数组查找数字
3.6 练习
第 4 章 千奇百怪的排序算法
4.1 常用排序算法
4.2 快速选择
4.3 桶排序
4.4 练习
第 5 章 一切皆可搜索
5.1 算法解释
5.2 深度优先搜索
5.3 回溯法
5.4 广度优先搜索
5.5 练习
第 6 章 深入浅出动态规划
6.1 算法解释
6.2 基本动态规划:一维
6.3 基本动态规划:二维
6.4 分割类型题
6.5 子序列问题
6.6 背包问题
6.7 字符串编辑
6.8 股票交易
6.9 练习
第 7 章 化繁为简的分治法
7.1 算法解释
7.2 表达式问题
7.3 练习
第 8 章 巧解数学问题
8.1 引言
8.2 公倍数与公因数
8.3 质数
8.4 数字处理
8.5 随机与取样
8.6 练习
第 9 章 神奇的位运算
9.1 常用技巧
9.2 位运算基础问题
9.3 二进制特性
9.4 练习
第 10 章 妙用数据结构
10.1 C++ STL
10.2 Python 常用数据结构
10.3 数组
10.4 栈和队列
10.5 单调栈
10.6 优先队列
10.7 双端队列
10.8 哈希表
10.9 多重集合和映射
10.10 前缀和与积分图
10.11 练习
第 11 章 令人头大的字符串
11.1 引言
11.2 字符串比较
11.3 字符串理解
11.4 字符串匹配
11.5 练习
第 12 章 指针三剑客之一:链表
12.1 数据结构介绍
12.2 链表的基本操作
12.3 其它链表技巧
12.4 练习
第 13 章 指针三剑客之二:树
13.1 数据结构介绍
13.2 树的递归
13.3 层次遍历
13.4 前中后序遍历
13.5 二叉查找树
13.6 字典树
13.7 练习
第 14 章 指针三剑客之三:图
14.1 数据结构介绍
14.2 二分图
14.3 拓扑排序
14.4 练习
第 15 章 更加复杂的数据结构
15.1 引言
15.2 并查集
15.3 复合数据结构
15.4 练习
第16章 面试题
第 17 章 十大经典排序算法
README
本文档使用 MrDoc 发布
-
+
首页
9.3 二进制特性
# 9.3 二进制特性 利用二进制的一些特性,我们可以把位运算使用到更多问题上。 例如,我们可以利用二进制和位运算输出一个数组的所有子集。假设我们有一个长度为 $n$ 的数组,我们可以生成长度为 $n$ 的所有二进制,1 表示选取该数字,0 表示不选取。这样我们就获得了 $2^n$ 个子集。 ## [318. Maximum Product of Word Lengths](https://leetcode.com/problems/maximum-product-of-word-lengths/) ### 题目描述 给定多个字母串,求其中任意两个字母串的长度乘积的最大值,且这两个字母串不能含有相同字母。 ### 输入输出样例 输入一个包含多个字母串的一维数组,输出一个整数,表示长度乘积的最大值。 ``` Input: ["a","ab","abc","d","cd","bcd","abcd"] Output: 4 ``` 在这个样例中,一种最优的选择是“ab”和“cd”。 ### 题解 怎样快速判断两个字母串是否含有重复数字呢?可以为每个字母串建立一个长度为 26 的二进制数字,每个位置表示是否存在该字母。如果两个字母串含有重复数字,那它们的二进制表示的按位与不为 0。同时,我们可以建立一个哈希表来存储二进制数字到最长子母串长度的映射关系,比如 ab 和 aab 的二进制数字相同,但是 aab 更长。 ```py def maxProduct(words: List[str]) -> int: cache = dict() max_prod = 0 for word in words: mask, w_len = 0, len(word) for c in word: mask = mask | (1 << (ord(c) - ord("a"))) cache[mask] = max(cache.get(mask, 0), w_len) for h_mask, h_len in cache.items(): if (mask & h_mask) == 0: max_prod = max(max_prod, w_len * h_len) return max_prod ``` ## [338. Counting Bits](https://leetcode.com/problems/counting-bits/) ### 题目描述 给定一个非负整数 n,求从 0 到 n 的所有数字的二进制表达中,分别有多少个 1。 ### 输入输出样例 输入是一个非负整数 n,输出是长度为 n +1 的非负整数数组,每个位置 m 表示 m 的二进制里有多少个 1。 ``` Input: 5 Output: [0,1,1,2,1,2] ``` ### 题解 本题可以利用动态规划和位运算进行快速的求解。定义一个数组 dp,其中 dp[i] 表示数字 i 的二进制含有 1 的个数。对于第 i 个数字,如果它二进制的最后一位为 1,那么它含有 1 的个数则为 dp[i-1] + 1;如果它二进制的最后一位为 0,那么它含有 1 的个数和其算术右移结果相同,即 dp[i>>1]。 ```py def countBits(n: int) -> List[int]: dp = [0] * (n + 1) for i in range(1, n + 1): # 等价于:dp[i] = dp[i & (i - 1)] + 1 dp[i] = dp[i - 1] + 1 if i & 1 else dp[i >> 1] return dp ```
嘉心糖糖
2025年3月11日 19:31
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码