如何精通一个领域
- 切碎知识点
- 刻意练习
- 练习缺陷,弱点地方
- 感觉不舒服,不爽,枯燥
- 反馈
基本常用的数据结构
| 时间和空间复杂度 | 描述 |
|---|---|
| O(1) | 常数复杂度 |
| O(log n) | 对数复杂度 |
| O(n) | 线性时间复杂度 |
| O(n^2) | 平方 |
| O(n^3) | 立方 |
| O(2^n) | 指数 |
| O(n!) | 阶乘 |
数组和链表的数据结构
数组:内存里一段连续的存储区域
- 查询的时间复杂度:O(1)
- 插入的时间复杂度:O(n)
- 删除的时间复杂度:O(n)
链表:分为单链表和双链表
- 查询的时间复杂度:O(n)
- 插入的时间复杂度:O(1)
- 删除的时间复杂度:O(1)
相关案例
206.翻转链表
1 | class ListNode: |
24:交换链表相邻的两个元素
1 | class Solution: |
141.环形链表
1 | # 解题思路:根据快慢指针来判断这个链表中是否有环形的存在 |
堆栈和队列
栈:先入后出
队列:先进先出
相关案例
20.判断括号是否合法
1 | class Solution: |
232.用栈来实现队列
225.用队列事现栈
优先队列
实现机制:
- 使用堆(heap)来实现
- 使用二叉搜索树
相关案例
703.实时判断数据流中k大的元素
239.滑动窗口最大值
映射(map) 和 集合(set)
如何解决哈希碰撞?
- 拉链法
- 开放寻址法
hashMap vs TreeMap
hashSet vs TreeSet
python中使用的是hashmap和hashset
相关案例
242.有效的异位字符
1 | class Solution: |
1.两数之和
1 | class Solution: |
15.三数之和
1 | class Solution: |
18.四数之和
树&二叉树&二叉搜索树
链表就是特殊化的Tree
Tree就是特殊化的图
实现二叉树
1 | # python |
二叉搜索树
二叉搜索树,也成为二叉搜索树,有序二叉树,排序二叉树,是指一颗空树或者具有下列性质的二叉树
- 左子树上所有节点的值均小于它的根节点的值
- 右子树上所有的值均大于它的根节点的值
- 左右子树也分别为二叉查找树
相关案例
98.验证二叉搜索树
1 | # 低效法 |
235.. 二叉搜索树的最近公共祖先
1 | class Solution(object): |
236. 二叉树的最近公共祖先
1 | class Solution(object): |
二叉树的遍历
前序遍历(Pre-order):根-左-右
中序遍历(in-order):左-根-右
后序遍历(Post-order):左-右-根
递归和分治
相关例题
1 | # 递归法 |
1 |
贪心法
适用贪心法的场景
简单来说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解,这种子问题最优解成为最优子结构
贪心算法与动态规划的不同在于对每个子问题的解决方案都作出选择,不能回退,动态规划则会保存以前的运行结果,并根据以前的结果对当前进行选择,有回退的功能
相关案例
122.买卖股票的最佳时机 II
广度优先搜索
深度优先搜索
102.二叉树的层次遍历
1 |
104.二叉树的最大深度
111.二叉树的最小深度
1 | class Solution: |
剪枝
把较差的枝叶剪掉
相关案例
51.N皇后
1 | class Solution: |
52
36/37 数读
1 |
二分查找
1 |
实战例题
69.x 的平方根
1 | class Solution(object): |
字典树
- Trie树的数据结构
- Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎用于文本词频统计 。它的优点是最大限度的减少无所谓的字符串比较,查询效率比哈希表高
- Trie树的核心思想
- Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的
- Trie树的基本性质
- 根节点不包含字符,除根节点之外每个节点只包含一个字符
- 从根节点到某一节点,路径经过的字符串连接起来,为该节点对应的字符串
- 每个节点所有子节点包含的字符都不相同
实战例题
208 实现 Trie (前缀树)
1 | class Trie(object): |
1 | import collections |
位运算
位运算介绍
- 计算机中的内存是以二进制的形式存储的,位运算说白了,就是直接对整数在内存中的二进制位进行操作
位运算常用操作
- | 符号 | 描述 | 运算规则 |
| —- | —- | ———————————————————— |
| & | 与 | 两个都为1时,才为1 |
| | | 或 | 两个都为0时,才为0 |
| ^ | 异或 | 两个相同为0,相异为1 |
| - | 取反 | 0变1,1变0 |
| << | 左移 | 各二进制位全部左移若干位,高位丢弃,低位补0 |
| >> | 右移 | 各二进制位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算数右移),有的补0(符号右移) |
- | 符号 | 描述 | 运算规则 |
位运算的应用
1
2
3
4
5
6
7
8
9
10
11x & 1 == 1 OR == 0 判断奇偶(x%2==1)
x = X&(X-1)=> 清零最低位的1
x & -x => 得到最低位的1
1.将x 最右边的n位清零 - x & (~0 << n)
2.获取x的第n位值(0或1)-(x >> n) & 1
3.获取x的第n位的幂值 - x & (1 << (n-1))
4.仅将第n位值为1 - x | (1 << n)
5.仅将第n位置为0 - x & (~(1 << n))
6.将x最高位至第n位(含)清零 - x & ((1 << n)-1)
7.将第n为至第0位(含) 清零 - x &(~((1 << (n+1))-1))
实战例题
191.位1的个数
1 | def hammingWeight(self, n): |
231. 2的幂
1 | def isPowerOfTwo(n): |
338.比特位计数
52. N皇后 II
1 | def totalNQueens(self,n): |
动态规划
1.递归 + 记忆化 – 》 递推
2.状态的定义 : opt[n],dp[n],fib[n]
3.状态转移方程:opt[n] = best_of(opt[n-1],opt[n-2])
4.最优子结构
1 | 递推公式 |