刷题
算法小白如何高效、快速刷leetcode? 刷多少题? 大厂需要刷哪些题?3.具体怎么刷? https://www.zhihu.com/question/321738058/answer/1252502958
lintcode
https://www.lintcode.com/problem/?utm_source=sc-zhihu-lm0527
解题法
双指针法
滑动窗口算法 sliding window algorithm
判断两个字符串是否是异构同质,异构同质的定义如下:一个字符串的字符,重新排列后变成另外一个字符串。
LeetCode按照怎样的顺序来刷题比较好?
https://zhuanlan.zhihu.com/p/104983442
指针类算法
- 左右指针
- 快慢指针
https://blog.csdn.net/xxdddail/article/details/93735314
什么是「滑动窗口算法」(sliding window algorithm),有哪些应用场景?
https://www.zhihu.com/question/314669016
什么是「滑动窗口算法」(sliding window algorithm),有哪些应用场景?
别再埋头刷LeetCode之:北美算法面试的题目分类,按类型和规律刷题,事半功倍
算法篇目录汇总
https://darktiantian.github.io/%E7%AE%97%E6%B3%95%E7%AF%87%E7%9B%AE%E5%BD%95%E6%B1%87%E6%80%BB/
labuladong的算法小抄
https://labuladong.gitbook.io/algo/
动态规划及面试,学完这一篇,你就入门了:Dynamic Programming, 动态规划,经典题目
https://zhuanlan.zhihu.com/p/89391817
LeetCode按照怎样的顺序来刷题比较好?
https://www.zhihu.com/question/36738189/answer/908664455
双指针技巧汇总 https://blog.csdn.net/xxdddail/article/details/93735314
带答案面经分享-面试中最常考的树模型! https://www.lizenghai.com/archives/5816.html
秒杀算法面试必须掌握的14种模式
https://zhuanlan.zhihu.com/p/90664857
https://www.educative.io/courses/grokking-the-coding-interview?aff=K7qB
https://github.com/Huixxi/Algorithm-with-Cplusplus/tree/master/莱特扣的-系列/15.Pattern:%20Topological%20Sort%20(Graph)
1. 滑动窗口 Sliding Window
https://www.cxyxiaowu.com/672.html
2. 双指针 Two Pointers
3. 快慢指针 Fast & Slow pointers
4. 区间合并 Merge Intervals
5. 循环排序 Cyclic Sort
6. 原地反转链表 In-place Reversal of a LinkedList
7. 树上的BFS Tree Breadth First Search
8. 树上的DFS Tree Depth First Search
9. 双堆 Two Heaps
10. 子集 Subsets
11. 变种二分 Modified Binary Search
12. Bitwise XOR
13. 最大前K个元素 Top 'K' Elements
14. K-路归并 K-way merge
15. 0/1 Knapsack (Dynamic Programming)
16. 拓扑排序 Topological Sort (Graph)
17. Kth Smallest Number (hard)
https://wdxtub.com/interview/14520606002338.html
补充:
并查集
单调栈
字典树
rolling hash
算法策略侧重的问题类型
一般常遇到的问题分为四类
判定性问题:可用递推法、递归法
计算问题:可用递推法、递归法
最优化问题:贪心算法、分治法、动态规划法、枚举法
构造性问题:贪心算法、分治法、广度优先搜索、深度优先搜索
数据结构和算法
编程的内功
电话面试网站
collabedit.com
coderpad.io
白板面试 Onsite(当场)
硅谷工作
- 留学 F1 2. 外企中国 美国总部 L1 3. 直接硅谷公司 Offer H-1B
学习方法
chunk it up (切碎知识点)
deliberate practicing (刻意练习)
feedback 即时反馈 主动反馈:自己去找 高手代码(github leetcode主动练习) 被动反馈:高手给你指点 code review
outliers 异类:不一样的成功启示录
切题四件套
Clarification 明确题目意思
Possible solutions 多列出解 用最优的
compare(time/space) optimal(加强)
Coding(多写)
Test cases 加上测试案例
Big O notation
时间复杂度
空间复杂度
斐波拉契数列(递归)
master theorem 主定律 和递归相关
练习
leetcode
数组
access O(1) 根据下表直接找到元素
insert 平均O(n) 插入后,后面的元素都要往后挪动
delete 平均O(n) 删除后,后面的元素都要往前挪动
链表
access O(n) 从头指针查到指定位置
insert 平均O(1) 待插入的元素next指向插入位置的元素,把插入位置的元素的前一个元素的next指向待插入的元素
delete 平均O(1) 待删除元素的前一个元素的指针直接指向待删除元素的next元素
单链表
双链表
https://www.bigocheatsheet.com/
递归 recursion
分治 divide & conquer
求众数 majority element
贪心算法 greedy 有很大局限性 在股票买卖问题中 需无限次交易 无手续费
广度优先算法 BFS breadth first search 地毯式搜索
深度优先算法 DFS depth first search
剪枝
N皇后问题
数独问题
二分查找
- sorted (单调递增或者递减) 数组必须有序
- bounded 存在上下界
- accessible by index 能够通过索引访问 数组适合二分查找 链表不适合
求平方根
- 二分法
- 牛顿迭代法
https://www.zhihu.com/question/20690553?sort=created
https://leetcode.com/problems/sqrtx
https://www.beyond3d.com/content/articles/8/
https://leetcode.com/problems/valid-perfact-square/
位运算 二进制位运算
异或 相同为0 不相同为1
x ^ 0 = x
x = x & (x-1) 清零最低位的1
x & -x 得到最低位的1
复杂的位运算操作
hamming weight 统计位1的个数
位运算解决N皇后问题
计算路径 count the paths
动态规划 dynamic programming 动态递推 programming就是递推的意思 自低向上
- 递推 (递归+记忆化)
- 状态的定义:
- 状态转移方程
- 最有子结构
DP VS 回溯(递归) VS 贪心
LRU cache 缓存 least recently used 最近最少使用
LFU
bloom filter 布隆过滤器 高并发 分布式
Map-Reduce
priority queue 一个任务的密度 = 重要程度/完成时间
kelly formula 凯利公式
game theory 博弈论
五个代码模板
- 递归
终止条件
处理数据
递归
还原条件
- DFS 递归写法
BFS
二分查找
dp
状态定义
dp状态的推导
- 位运算
vim with python support
算法为王
http://blog.fens.me/series-algorithm/
架构师的信仰系列文章
http://blog.fens.me/series-architect/
OI/ACM
https://www.zhihu.com/collection/276899140
在OI中,有哪些看似没大碍,却很致命的错误?
https://www.zhihu.com/question/269419727
ACM 的正确入门方式是什么?
https://www.zhihu.com/question/517275j16
运筹学和理论计算机科学
bilibili 妈咪说和遇见数学
计算引论
做题总结
给定范围中求有几个数
2到6返回中在数组中有几个
[0,4,5,7,8,11]
可以二分
< 2 a个
< 7 b个
b-a 的个数就是2-6范围内有几个数
构建 预处理结构
1 2 3 4 5 1 3 6 10 15 前缀和数组
等概率输出一组数,求输出另组数
判断基偶,从中间分,开头或者结尾返回0或者1,中间多出来的就重新随机 用0或者1,表示目标输出数。