九章算法 听课笔记


****************************************************听课笔记****************************************************

#2018-11-05 124717 November Monday the 45 week, the 309 day SZ

系统设计第一次课

面向web后端,
实习生不会考到系统设计。
tradeoff
soa
pull model
push model

数据存储系统
异步任务,消息队列

6
面试形式:
设计某系统,设计微博,设计Facebook,看看你能够撩到多深,多好,面向非常后端的工程师,
设计某个系统中的某某功能。比如,登录密码不能错误多少次,删除一个微博功能。标记邮件为已读功能,某个小功能。
说清楚的话还是要求对系统设计有基本概念和认知。

7
系统设计SD和面向对象设计OOD区别
哪种面试需要写代码?
系统设计属于吹牛扯淡的话题,一般不考代码。面向对象需要写代码,写出各种继承关系。
知识点:
OOD考class,object, method,interface,inheritance,考察电梯设计,游戏设计。角色,操作
SD考察:数据库,网址系统设计,新鲜事系统设计。

9
课程有配套阶梯训练的。刷题消化课程内容。

10
面试问题:请设计Twitter。
第一句给面试官的话是?单向关注限制的博客系统,限制140个单词。微信是双向朋友关系,微博是单向关系,你关心别人,别人不一定关注你。
什么功能,场景,用户规模,

系统设计没有提到任何语言,需要数据库SQL语句。刷题用什么语言随意。没有和编程语言相关的东西。算法也和编程语言没关系。

系统设计评分标准:
有没有可行解。
特定问题,小功能设计能够答出来。
分析能力,根据设定的难点,解决掉
权衡能力,多种选择怎么选择最好的路线。没有标准答案。
知识储备。如何。
问题4S分析法:scenario,service, storage, scale
scenario设计场景,哪些功能,设计多牛逼
service服务把大系统拆分小问题
storage存储,数据如何存储与访问。
最重要,最难的部分。
Scale升级:解决缺陷,数据非常大,处理特殊问题。

对于Twitter,场景是:用户量,需要承担多大访问量,日活跃用户,月活量。这两个指标看看网站,APP的活跃量,Facebook日活:14亿。还要问有哪些功能需要设计。面试官肯定会告诉你。
用户量的影响主要是并发用户数。日活次数*每个用户平均请求次数/一天多少秒 = 150M * 60/ 86400 平均每秒10万次
一般每天60次网络请求。峰值和平均值的比例,合理值,2-9之间都可以。
30万次并发的读请求,写请求。重要的是计算过程,不是结果。
QPS用处,=100,用笔记本做web服务器就行。
1k,用好的web服务器就行。
QPS = 1万,需要建设1000台web服务器集群。如何维护,每一台挂了怎么办。
qps和服务器,数据库的关系。
一台服务器承受1000很牛了。一台SQL Database承受1千
nosql数据库cassandra承受1万的QPS,设计时候就是这样设计的。

300 I/O per second,每秒只有30次

service服务把大任务分解为小任务。只是设计某个功能,可以跳过这步。用户服务,注册,登录。tweet service post a tweet news feed timeline. ; media service upload image upload video; friendship servicefollow unfollow
按照存储方式表单分类。
router:

flaskPython的web framwork,最快速搭建一个网站,里面最基本的概念都懂了。

存储方式:数据库,文件,缓存系统。
数据库:关系,非关系数据库
文件系统和数据库系统之间的关系:数据库构建在文件系统之上的。数据库无法脱离文件系统独立存在。如果学过操作系统,里面分为文件系统和内存系统,缓存系统就是内存系统了。
最开始肯定没有数据库,如果直接最文件系统操作,会非常痛苦,因为需求非常丰富。因为需求可以是查询年龄区间的男人,如果在文件系统中做,需要在所有用户信息中查找,太慢了,不太好查找,增删查改太难。
什么样的数据适合数据库和文件系统中?
结构化数据例如姓名,性别,年龄等就适合数据库中。图片视频非结构化数据适合文件系统。
缓存系统cache不支持持久化。持久化:断电就消失了。通常用来运算结果(花很长时间计算出来的),频繁访问的适合放在缓存中。
Redis是个非关系数据库。

27
非关系数据库:tweet service
关系数据库:user service
media servicefile system
friendship service sql/ nosql

系统= 服务+数据存储
程序=算法+数据结构

28
考察表单内容,存储什么东西?

休息5分钟
news feed新鲜事系统。
新鲜事:登录朋友圈,看到的信息流,朋友发布信息的集合。
典型新鲜事情系统:Facebook,Twitter,朋友圈,RSS Reader(绝迹了,属于博客和微博之间的过度产品)。
系统核心因素:
关注,被关注。每个人看到的新鲜事不同。

C++写网站找抽。Java都比较少了。更多用PHP,Python,C++更适合底层开发。
新鲜事是伟大的发明。以前的博客是必须看看别人是否更新了,后来Facebook这种新鲜事情,这个就很轻松了,只要关注了,自动就推送给自己,不需要每天去刷他的博客。
信息流怎么存取,就是核心点。让大家回复,根据学生反馈,有针对性回复。从文件系统读数据库,
32
存储pull model,算法
在用户查看朋友圈时候,获取每个好友前100条tweets,合并前100条news feed。k路归并算法。
不关心时间复杂度,关心数据库读取次数和读取方式。
存储原理:
pull模型缺陷:非常慢
异步执行:创建记录,然后不管了,其他进行得到这个任务,慢慢执行。发帖后告诉用户,发帖成功,但是粉丝收到新帖子还要一段时间。
storage ;pull vs push模型朋友圈用push模型,因为大V问题。当我是大V,pull很慢,所以不可以用pull。所以会限制朋友圈人数最多5000,以前最多2000.
facebook为啥用pull模型,太复杂了,有群信息,也可以单向关注,如果用push,太麻烦了。

scale扩展,解决pull缺陷,最慢的部分发生在用户读请求时候。在DB访问前加入cache,cache每个用户的timeline,cache每个用户的news feed。
浪费更多存储空间disk:
push结合pull模型:普通用户仍然push。明星不用push到用户的新闻里,

没有很大流量,push最好。资源少,偷懒,用户发帖少,实时性要求不高用push。
用pull:资源充足,实时性要求高,用户发帖多,单向好友关系,有明星问题。
54页结束。
总结:4S是一个套路:问清楚再动手。
分析比答案重要,关注这个过程是否和谐,有道理。系统设计没有标准答案,通过分析过程展现自己的知识储备。最后一期系统设计课程。
63页PPT结束
#2018-11-03 191405 November Saturday the 44 week, the 307 day SZ

第九章 
lintcode 6
merge模板,三个while
固定排序

lintcode 64
先比较最大的数字,也就是从右侧开始比较

lintcode 839
合并区间数组

486
k路归并算法
堆把堆首放进去,
两两合并

547
使用hash table哈希表
第一个数组放在hash里,第二个数组去hash里面查找
第二种方法:排序,进行二分查找,有个去重的问题。两个数组都排序,可以merge two sorted arrays

548求所有重复元素
方法1:哈希表
方法2merge two sorted arrays

739
哈希表可以做

654
稀疏矩阵,在AI中用很多。
用merge two sorted arrays
先做向量的转换,没找到合适的做法,回去写一个参考答案。
931
用分治思想,
用二分法做
双重二分法

149卖股票
两个前缀和相减

类似问题,944子矩阵的和,大矩阵的和减去小矩阵的和。不要for循环左上角和右下角。只用for循环上下边界。把二维的问题,降维为1维。然后求子数组的和为0.求出前缀和,用哈希表做。

943
prefix sum解决

665
用任意点和0,0为区间的数字的和减去左边,减去上边,再加上多减的部分

840 

区间和
前缀和

817

249

线段树万能,
#2018-10-28 124046 October Sunday the 43 week, the 301 day SZ

九章算法 第8章
数据结构
lintcode 642
队列,一个push,一个pop,
9:40分噪音
10:00噪音
10:57

队列的某一个方法的时间复杂度才有意义。笼统谈论队列复杂度没意思。

13
O(1)的前提是key的大小。取出key字节,跑函数,算出一个index整数,如果key4个字节,O(1).如果key过长,就不是O(1)了。

a is b比较地址,a == b比较内容。

lintcode 134
很常考的老面试题。哈希表和链表,
lintcode657
lintcode 657

休息5分钟

lintcode209
数两遍。属于离线算法。

960没有从头数,属于在线算法,变难了

lintcode 4 丑数
高级数据结构,

lintcode 612

lintcode 545 
在线算法意思是数据不固定,是会一直变化的。一直会添加,删除。离线算法是数据一开始都全部给了,数据是死的,只要处理他就行了。
#2018-10-27 203734 October Saturday the 43 week, the 300 day SZ

九章算法 第七章 
基于排列和图的DFS
排列和组合有关系
典型代表:求全排列。
3
满足所有排列,复杂度n!
4
排列和组合上的区别
reverse和s[-1]区别
reverse产生一个迭代器
s[-1],返回一个结果但不是迭代器

全排列2例题讲解。
4
字符全排列lintcode10
去重就是选个代表,其他人就被放弃了,123好看的成为代表,

lintcode52,背诵就行

iteration都是靠背诵的。

n皇后问题lintcode33
求所有皇后的位置。同一行,同一列不能放2个皇后。2413,一种排列。每个数出现一次,说明列不重复。这个题靠背诵。还要避免斜线攻击。1234就会出现斜线攻击。一边找,一边判断。

next closet time被删除和排列无关
8
基于图的搜索,
基于排列很少,主要还是基于组合类的。
lintcode425.手机键盘问题。
DFS你不知道有几层循环的循环。KEYBOARD常量要大写才专业。
10follow up给个词典,要求组合的词都在词典里,怎么办呢?最典型的用tree,哈希表也可以搞定,
14
lintcode829 Word pattern,每个字母代表一个单词,然后判断后面的字符串是否和字母代表的单词匹配。
无后效性,前面对后面无影响。

16word search2
给一个矩阵,和词典,确定共同的单词。矩阵中单词可以从任何位置出发,向上下左右分别走。找path和node的区别
NP问题只能用搜索问题来做,
不是搜索题,有可能被你写成了搜索题。动态规划问题容易被写成DFS。所有方案,所有路径,一定是DFS,不要考虑复杂度问题。剪枝优化很少考。面试能写出来就是大爷了,不要考虑复杂度。

同时挑单词,两个单词不能共用一个字母。

lintcode121 word ladder2 找所有最短路径。纯粹的DFS,不一定有最优解,容易走入死胡同,要和结合下,往这个方向走,是不是离终点越来越近。从终点到起点做个BFS,每个点离终点举例。终点到起点BFS,起点到终点用DFS。推荐大家不要升级电脑软件,等出了补丁后再升级,第一个软件版本都是小白鼠。
老师逐行讲解每句代码是什么意思。
求所有方案,是否可以只用BFS,比如求子集,要算很多无用路径,
Python中函数前面加上下划线表示别人无法使用,类似private意思。两个下划线表示系统级别的。变量不需要提前定义。

凡是Word有关的题都要很好掌握,直接背诵,不要求一定理解。
最近的lintcode搜索出了点问题,回去修复下。看来九章算法和lintcode是一个公司了,而且是令狐冲在维护。牛逼死了。
#2018-10-21 132514 October Sunday the 42 week, the 294 day SZ
九章算法
第六章
基于组合的DFS

先修知识
3
什么时候使用DFS,
找所有方案的题,基本都是DFS,除了二叉树,90%的DFS,要么是排列,要么是组合

什么时候使用BFS?找最短路径,分层遍历,遍历图,拓扑排序,非递归找东西

找所有方案使用DFS,BFS的区别,优劣势什么。
BFS复杂度取决于宽度O(w),DFS取决于高度O(H),哪个更好呢,
复杂度都是O(n),n代表所有点的个数。无论什么顺序,横竖都一样。比较深用BFS比较宽,用DFS,

8
combinatio sum

lintcode 135
找所有点,标记为true,不用标记回来。找所有路径,要前后标记。

lintcode 153
去重比较麻烦

11 k sum ii lintcode90
找出所有k个数之和为target的组合
把限制加入DFS的代码就行了。
凡是找所有方案的问题,不能只使用动态规划的。可以用动态规划来优化。

休息5分钟后

lintcode136
套用代码

lintcode680

wildcard matching
lintcode192
memo,字典表示算过了,后面就不用继续算了,要不然会超时。

lintcode 154和上面很类似。

lintcode 582
计划搜索就是动态规划

#2018-10-21 092731 October Sunday the 42 week, the 294 day SZ

九章算法 第五章
二叉树和树上的DFS
抱歉上周翘课,今天接着上。助教进来静音。
DFS很大的话题,这个类型的题目非常多,考得非常多,三节课都讲DFS,付出多少,收获多少。不像BFS,付出一点,收获很多。
DFS考点:路径,变化,查找树;非递归的中序遍历。

先修内容:针对基础薄弱的同学。递归,搜索,遍历,分制,Python中不用考虑returnType,因为天生可以返回两个值。

4
二叉树考点分析:求值,求路径,不管如何变化,考点都是基于树的DFS,

6
很多概念一图讲明白,蓝色部分,算法的名字。红色不是算法(递归和迭代)他们只是一种实现方式。自己模拟栈,模拟遍历和分治法。同学提问题:需要准备红黑树,等高级数据结构,不需要,知道他们时间复杂度就行
基本二叉树都可以用分治法解决。

例题:596,求子树的和最小。
n个节点的二叉树,有On个子树,每个节点都可以代表一个子树。想办法把每个节点遍历一下,算下每个节点代表的子树的和是多少就行。计算某个节点的时候,先计算两个子节点,再计算父节点。这就是用了后序遍历的方法。最后求父节点。

下一个例题480,求所有从根到叶子节点路径。
用遍历方法tranversal,为什么要pop,找到3之前,把2,5扔掉。找这条路径开头的所有路径。分治法一定有返回值。这个题要特殊处理叶子节点。
当叶子节点无法从左右两个节点判断时候

例题:88最近公共祖先问题。这三个题都要弄清楚,属于经典问题。

例题474最近的共同祖先2
画图解释:A,B子节点的分布情况:都在左边,右边,左右分别一个,有一个在根部。LCAlowest commen Analersister。难点:return值的定义。

578最近共同祖先3

13页
第二类考察形态
例题453flatten binary tree to listnode把二叉树拆分为链表
分治法解决更好。遍历法去了左边,还要考虑右边,容易出错。
二叉树的高度是Ologn,最坏是On。
heap,红黑树是Ologn,平衡二叉树才是Ologn。

16页:二叉搜索树的性质,左边小于右边。不下降序列,排好序的。如果树是不下降序列,不一定是搜索二叉树,因为所有节点都相同。

休息5分钟

例题:902找第k个最小的元素。最小的节点在最左边,最大的在右边。找最小的节点的时间复杂度最坏是O(n),所有节点都在左侧。在顺序中找到第k个,停下来。阅读全文背诵二叉查找树的代码。用非递归方法解决二叉搜索树。有右子树,没有右子树情况。第一个左拐的地方。时间,空间复杂度都是On,

18页
二叉树被修改.
非递归都是靠背诵

例题900找到最接近的点
比我小的最大值,比我大的最小值。比较下?


寻找k个最接近的值。先中序遍历,然后二分法,但是时间复杂度太高。所以,保留树的结构,思路一样,把树镜像一下,
#2018-10-14 114113 October Sunday the 41 week, the 287 day SZ
#2018-10-14 095252 October Sunday the 41 week, the 287 day SZ
听九章算法求职讲座笔记
Thank you for registering for "拿到offer绝不是终点,IT职场与跳槽经验分享". 

听课笔记
求职和当面试官的经验
段誉,美国本科,硕士,三家美国公司4年工作经验。
职场潜规则:技术篇。Git代码管理
最近几年流行,几年前用CDS软件。Git优点:分布式,大牛开发的。保持commit history整洁,你的代码会一直留在系统里,
rebase就是变基。基就是共同祖先。
git rebase -master.找到共同祖先,第二个白色点,先添加master,再把feature添加到master后面。为什么用rebase和git merge类似。都是想把当前branch 和目标branch同步。
git rebase -i origin/
git commit --amend
git fetch & git rebase 等价于 git pull --rebase
git pull 等于 git fetch & git merge
只在自己的branch上进行操作,确保没有人在你的branch基础上进行开发。

接下来非技术技巧:
埋头代码缺点:升值慢,缺乏协作。很多公司比较主观,有升值名额,老板说了算。大公司招人时候默认程序员可以到高级工程师的level。印度人优势:语言优势,和白人一起吃饭,一起坐车,shuat gang,给副驾驶留个位置。他们喜欢问有没有update,其实是用他们的办法催你。ETA,其实就是给deadline,

做好和老板一对一谈话,
每个月,聊技术细节没必要,主要聊工作方向,规划,不要打小报告,挺烦人。
基于用户增长量,没有技术经验的项目经理瞎指挥,做技术的都知道那个没意义。

导致信息闭塞
当时还在,第二天过去老板,同事就不在了,咖啡还在。

刷题的水平,如何判断自己的实力如何?
随机抽样,做题,不要看答案,做个大致判断,分为四个等级:
等级一:4成easy,2成中等,没刷过题的人,
等级2
7成easey,6成中级,BFS,DFS,都能做出,5成难题能看懂,面试三线初始公司,尝试传统大公司。不建议一线公司。
等级3
独立完成8成简单题,每题不超过15分钟。8成中级题,不超过30分钟,不计时完成难题。
等级4
9成简单,9成中级,45分钟3成难题,5成不计时也能完成,这个层次才能到达FLAG标准,
刷题其实没有底部的,建议边刷,边面试。

面试者分类,学生,小公司,大公司码农。
学生:优势:时间充裕,专职刷题,学习能力强,算法知识新鲜,比较自由,组队刷题,相互交流。不足:有课业负担,实践项目经验少,建议:多去实习,多做项目,
小公司码农,优势:有工作经验,了解面试流程,共同话题多,劣势,全职员工,不能在公司刷题,白天精力消耗过多,没有时间刷题,请假很难,没有时间去面试。很难拿到合适的offer
大公司的码农,
优势:简历好,心态好,可以内部换组,劣势:战线很长,犹豫不决。

跳槽时机:
发奖金时间,拿到股票时间,注意身份,OPT期间,H-1B没有中签,
H1B已经生效且没有开始办绿卡,绿卡I-140已经批准+180天。

在职如何准备分阶段跳槽?
阶段一:开矿,刷起来找感觉,周末抽出一整天刷题,积累假期,
阶段二、集中抱兵,:快速完成一刷,过一遍所有常见题。
阶段三:开始骚扰,面试非理想的公司。找面试感觉。调整刷题策略,目标是完成二刷,减少本职消耗。
阶段四:
全面战争,大规模电面,尽量争取OA,网上自己做。尽量不要为电话面试请2个小时假。
技术电话面试下午1,2点,以为你吃饭去了,目的就是为了节约假期。
阶段5
把面试集中在2个星期内,
阶段6
等面试结果,挑选offer,聊薪水,
跳槽的坑
很多人问当前薪水,不能告诉他们,绕开话题,直接告诉期望薪水。拿到offer,不能立刻告诉现在的老板,等确认下家可以随时入职了,再告诉老板。不可以当天走人,不做交接,根老板闹翻。
保存个人文档,

答疑阶段:
生命不息,刷题不止。
千万不可以暴露自己以前的工资,坚持自己的期望,觉得自己值这么多钱,就要坚持底线。跳槽尽量不要离职,攒假期,攒两个星期假期,集中面试。集中挑选offer。离职前把最后几张工资单保存好。
国内翻墙,国内有很多外企,先去外企,然后转过去。
接了FLAG offer,过3个月后再入职,可以吗?这个很正常的,延迟半年才过去也是可以的。具体和HR沟通下。
和面试官聊技术细节,
为什么要离开现在的雇主,想新的机会,尽量避免前雇主坏话,
刷题中等题为主,不要啃难题,性价比不高。

决心和意志是学好编程的关键。
程序员之路,别怂,就是干!


#2018-10-13 114543 October Saturday the 41 week, the 286 day SZ
第四章 10.13周六  BFS 和拓扑排序

Python里面没有interface。不考
也没有private方法,
hashSet就是set,没有treeset这个东西。Python里面有abstract类。

开始了空间搜索。只有3天时间准备,准备BFS就划算了,学起来很简单,出现频率非常高。
拓扑排序Topological Sorting. 

deque类似interface。
二叉树,矩阵都属于图的一种方式。
什么时候使用BFS,1图的便利:层级便利,由点及面,连通点,;最短路径:
5
最长路径是NP问题,只能用搜索算法。
7
二叉树上的空间搜索。
8
起点放到queue
,for上一层放到下一层
用deque双向队列,
Queue缺点:服务于多线程,效率低,不好的设计,queue = Queue()
queue.pop(x) pop空的Q,会卡在这里,会超时,其实是写错了。尽量不用这个Queue。
搞清楚上一层节点怎么弄到下一层节点就行了。
for循环里面的下划线意思是变量无所谓,我只要循环次数。
list.pop(0)不能用因为是On的,list是数组,删了第一个,怎么维护这个数组?肯定把后面的整体左移,所以list.pop(index)只要不是最后一个,时间复杂度都是On。
只有deque才支持O1的时间复杂度。
deque怎么实现的?Python帮我们包装好了,底层的数据结构是数组,链表,linkedlist, 树tree,二叉树。所以deque是双向链表实现的。dict, HashSet, HashMap.用数组实现的。链表放在数组里。
9
为啥使用队列作为主要的数据结构。为啥不用栈呢。栈是先进后出,在做一个DFS的搜索。
12
序列化,反序列化
16
图上的BFS
树和图的BFS区别。同一个节点有可能被重复放到队列里面。所以用visited做个标记,说明已经被访问过了,就不用重复放入队列了。
题目:克隆一个图。
克隆:深度拷贝deep copy,克隆羊,把克隆后的羊做成了羊肉串,以前的羊还活着。这就是克隆,我把图克隆了,克隆后得到一个新的图,但是新图做任何修改,原来的图不会有任何影响。
图由点和边组成,先复制点,再复制边。怎么找到所有的点。这个题只给了一个点,从这个点出发找到其他的点,才能克隆。最标准的方法就是使用BFS做。一定注意代码的结构化。

题目:world ladder.注意这种题型,字符串,单词,开始,结束,变成词典里的单词,每次只能修改一个字母。需要修改的序列长度就是。队列主要是要保证顺序,set里面没有顺序,隐士图的BFS,这个没有告诉你什么是点,什么是边。所以叫做隐士。写Python一定要明白每个函数的时间复杂度。简单图:边长度都是1.

休息后
图上时间复杂度On+m.你、点的个数,m边的个数。所以二叉树是On。
动态规划一定要有一个顺序,从左到右或者从上到下。
更快,只能用双向BFS。起点走一步,终点走一步,碰到一起,然后起点和终点走过路径相加就可以了。
27
拓扑排序
必有一道拓扑排序。当BFS,DFS都可以用,但是尽量用BFS,因为DFS用递归实现,容易栈溢出,自己写很难,写出来别人也看不懂。平时尽量少用DFS,能不用就不用。
入度:有几个其他点指向自己,入度就是几。找依赖关系。一个图可能有多个或者0个拓扑排序。
DP学一点没用,需要系统学习,很难。
Python课程通过分享群里就可以免费看。
DP主要就是看看你数学好不好。

#2018-10-07 113724 October Sunday the 40 week, the 280 day SZ
第三章 双指针算法:同向双指针,相向双指针

不上课也可以去大公司面试,看公司在某个时刻是否大量招人。
覆盖80%的知识点,强化班覆盖99%的知识点。强化班也是令狐冲上。只有少数公司会考。

下面几个词一个意思:除了输入,输出,没有其他的空间。常数级别的变量也是可以接受的。
in place原地
no extra memory
O(1) space
constant space

移动零
同向双指针
移动0到末尾,保持其他相对顺序
用非零元素覆盖0元素的位置,最后把最后剩余的位置用零填充
读快,写慢

老师的要求就是把题目看一遍。
有没有更快的方法呢?如果不要求相对的顺序。0,1,2,3最理想的是几次呢?3和0调换就行了,两次修改。

非0和零在左右两侧
0,1,,2,3为例子,从左边到右边,找到不该在左边的,从右边到左边,不该在右边的,和经典算法:快速排序很像,快速排序非常频繁的被考。快速排序不稳定,无法保证原来的相对顺序,

为啥研究排序算法的稳定性,有时候4,1 1 2,希望让原来在前面的继续在前面。

相对方向双指针
回文串:
while跳过不考虑的字符

两数之和问题
相向,面对面走,直到相遇为止。
一般都是先排序,这种双指针复杂度是n+nlogn,n的意思是需要排序占用时间,这种方法可以节省空间。
Python里面的哈希表就是dictionary字典啦。如果用哈希表,就会用更多的空间,复杂度是O n,
只能使用哈希表,

设计数据结构问题,插入排序,哈希表完胜了插入法

求数组两两配对,总共有多少组的和是target。while 保证right,left要跳过相同的数字,

3个数字之和,
a+b+c =0,如果用hash表,把其中一个数字放到hash里,for两个循环,找b,c搭配,2+3,看-5是否在里面。

双指针法:a+b=-c,nlgn, On *On + nlgn=n2,for循环a的位置,空间复杂度是O1,没有用到额外的空间,

nums.sort()使用了快速排序,时间复杂度是nlgn,

三边组合为三角形,
组成三角形条件是最小的两边之和大于第三边,

休息5分钟
老师神曲:九章算法

两数之和,最接近tartet
两个指针法,

三数之和最接近target

31 partition array
红黑树Python里面没有,

partition缺点是不稳定,无法保证原有的顺序,

颜色分类sort colors问题
i指针,碰到0左移,碰到2右移。碰到1不动。
三个指针,面试有运气成分。
rainbow sort,计数排序,counting sort,会占用额外空间On,所以只能基于比较排序,结论:基于比较最优时间复杂度nlogn

radix sort叫做基数排序,
nlogk,复杂度,用时间复杂度倒推算法。

merge sort,归并排序,复杂度,

#2018-10-07 210757 October Sunday the 40 week, the 280 day SZ
面试必考算法:
二分法(binary search)是面试中常见的算法

双指针算法:同向双指针,相向双指针
快速排序(Quick Sort)和归并排序(Merge Sort)是算法面试必修的两个基础知识点。
快速排序算法
归并排序算法
快速选择算法 Quick Select

宽度优先搜索。英文全称 Breadth First Search,简称 BFS。
什么是队列,如何自己实现一个队列
什么是 Interface,LinkedList 和 Queue 之间的关系是什么?
什么是拓扑排序
如何定义一个图的数据结构
课后补充内容有:
宽度优先搜索(BFS)的另外两种实现方式
双向宽度优先搜索算法(Bidirectional BFS)


#2018-10-07 092901 October Sunday the 40 week, the 280 day SZ
第二章 二分法 

老城号码
zoom电话会议
@foxmail.com

提问可以被公开,一般看不到别人的提问记录,免得对话框太多聊天记录

LeetCode上面ladder下面的九章算法课程里面有练习题,只有简单部分做完后才可以看下一节东西。

随刻教程用来提前预习,有文字和视频的方式。只有三个月的有效期。要不把东西复制到博客里?

令狐冲老师,讲课不错。

自我感觉水平差,一定要提前预习。


开课了,
二分法三个境界,
先修内容,
递归深度是log n,所以不会引起溢出stack overflow
时间复杂度代表数量级,不关心系数,
第九页PPT要背诵下来,里面描述所有常见算法的复杂度。
logn大部分都是二分法,
根号n都是分解质因数,一般也很少考,质因子化,就算碰到了,从题目中也能看到。
比n更高的复杂度只能是二分法,根据复杂度推导算法是面试中常见的。
n复杂度是高频的,
nlogn可能有的算法,排序,堆heap,priority queue, balance BST二叉树,tree set,分治法,归并排序,快速排序,双重循环,
多项式N时间复杂度,组合问题
非多项式NP级别的时间复杂度,搜索问题,只能用深度优先搜索
递归还是while循环
面试考点,递归和动态规划,考递归多点。

14
sketchbook画图软件
start + (end- start)/2在Java和C++中防止溢出,Python中不怕溢出,自动变成什么东西。
infinite loop死循环
start + 1 < end

18
数组分为两部分,满足o不满足x,
底部的return -1是为了有可能找不到的情况。

老师其实按照PPT,讲上面的练习题,所以必须在上课前自己做一遍练习题。
程序结构不好,很容易出bug,优化程序结构,先找到最后一个圈,先写整理架构,再慢慢实现每个函数
21
倍增法:不断乘以2,

上半节课的内容:
根据时间复杂度倒推算法,二分法模板,倍增法
下半节课:
圈和叉叉的条件:数据的具象化,
打印课件还是有必要的。4,5,,1,2,3横线,竖线
旋转的排序数组,
二分法解决圈圈和叉叉的模型。
montain sequence先上升,后下降
最后一个圈的条件是
第一个×的条件

found peak elements
只有四种情况,波峰,波谷,上升,下降的地方。

search in rotated Sorted array
用两次二分很简单解决,
能不能只用一次二分法,
n怎么变成了二分之n,


#2018-9 -30 204307 October Wednesday the 42 week, the 290 day SZ
九章算法
第一课 9.30日
课程错过不补课,也不提供任何视频 • 你才会把在两个小时内集中精力,全神贯注 • 你才会把学习放在第一位,而不是先 LoL 一把,先逛个街,先和朋友吃个饭 • 你才会获得最佳的课程体验 • 良苦用心希望同学们理解 • 不允许建私群(包括QQ群,微信群) • 在QQ群中拉人私下组群的将被踢群并不再提供QQ答疑服务 • LintCode 需要单独先注册一个账户,不要使用九章的账号密码去登陆 • LintCode 阶梯训练必须先完成上一节课的作业,才能做下一节课的作业 • 课程各类服务的有效期为一年 • LintCode阶梯训练访问权限 • QQ群答疑 • QA答疑 • 课件 • 知识点小视频 第25页 上

所有答案
https//www.jiuzhang.com/solution/longest-palindromic-substring/

哪些知识点是高频的,多花一些时间,哪些不是,少花一些时间,哪些根本不考,别花时间

拿到Offer的四大法宝
别做难题
是面试不是考试
理解而不是单纯的背诵
反复练习

课程配套的 LintCode 阶梯训练

刷题刷到什么程度可以去面试了呢?
lintcode 把200-300个题目刷两遍, 其中刷过的题目60%题目做到bug free,就比较好啦。

O(logN) 的算法几乎可以确定是二分法。
然后 O 代表的是时间复杂度。

 

未完待续

认识你是我们的缘分,同学,等等,学习人工智能,记得关注我。

 

微信扫一扫
关注该公众号

《湾区人工智能》

 

 

****************************************************知乎live****************************************************
211大学数学本科,美国应用数学研究生,美国博士,老板去了工业界,又去了德国海德堡大学。
刚转型的前三年很痛苦,因为没有机器学习,计算机视觉的经验。
欧盟玛丽居里项目,
混合非线性规划。
去意大利和法国十个月,当地都是运筹学教授。前三年机器学习和计算机视觉机会很少的。联合指导博士机会就很少了。计算机基础差,全靠自学,旁听海德堡的机器学习课程,看了10年20年内的计算机视觉方法。半年后,博士的三年半后,着手写组合优化和计算机视觉结合的论文,博士四年半毕业。找到加拿大蒙特利尔医学影像教授,为什么用离散优化的方法解决计算机视觉,有什么不同,带来什么好处,故事要讲好,半年时间写出了论文。用鼠标在图片做涂鸦,涂鸦了几道,就可以做分割。相当于手工分割图片了。今后找计算机视觉基本都靠这篇论文了。

下面讲人工智能和计算机视觉。二老板是计算机视觉的联合主编,还是联合创始人。
人工智能做预测,以往价格列表,后面的价格如何。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值