收藏 分享(赏)

07.O(N)时间解决的面试题(上).ppt

上传人:scg750829 文档编号:4850354 上传时间:2019-01-16 格式:PPT 页数:21 大小:811.50KB
下载 相关 举报
07.O(N)时间解决的面试题(上).ppt_第1页
第1页 / 共21页
07.O(N)时间解决的面试题(上).ppt_第2页
第2页 / 共21页
07.O(N)时间解决的面试题(上).ppt_第3页
第3页 / 共21页
07.O(N)时间解决的面试题(上).ppt_第4页
第4页 / 共21页
07.O(N)时间解决的面试题(上).ppt_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、O(n)时间解决的面试题(上),七月算法 曹鹏2015年5月9日,2/21,,提纲,简介 一些例题 例1 名人问题 (社会名流问题) 例2 Trapping in Rain Water 例3 Container With Most Water 例4 最大间隔问题 例5 01相等的串 例6 二进制矩阵最多1 总结,简介,O(n)是什么 注意n是什么 规模 图:节点?边? 扫一遍 两头扫 双重循环,但是内循环变量不减 单调性 队列 堆栈,3/21,,例1 名人问题,例1 有n个人他们之间认识与否用邻接矩阵表示 (1表示认识,0表示不认识),并且A认识B并不意味着B认识A,名人定义为他不认识任何人且

2、所有人都认识他的人。请求出所有名人。 分析: 最多有几个名人?只有1个!(有两个的话,他们认识不认识?)O(n2)的笨方法,遍历i,检查每个j,是否满足i不认识j且j认识i。,4/21,,例1 续,O(n)的方法 对于两个人i和j 如果i认识j, 则i显然不是名人,删掉i 如果i不认识j,则j显然不是名人,删掉j 最终剩余一个人,检查他是否是名人 实现1 用一个数组保存所有没检查人的编号 数组如何删除ai? 不保证顺序的时候 只要ai = a-n即可,5/21,,例1 续2,伪代码: 时间O(n),空间O(n),6/21,,例1 续3,实现2 优化、优化、再优化 能否O(1)空间? “一头扫”

3、 i j 0i 1没有名人 i + 1j 1没有名人 如果i认识j, 删掉ii = j, j = j + 1 如果i不认识j,删掉j j = j + 1,7/21,,例1 续4,实现3 “两头扫” i 0, j = n 1 i j 0i 1没有名人 j + 1n没有名人 如果i认识j,删掉i +i 如果i不认识j,删掉 j -j,8/21,,例2 Trapping in Rain Water,例2 Leetcode 42 给定每个块高度,求下雨后积水。 图对应0,1,0,2,1,0,1,3,2,1,2,1 分析: 每一块和水高度等于它左面(包括本身)的最大值和右边(包括本身)的最大值里较小的,

4、9/21,,例2 续,利用“前缀”和“后缀”,10/21,,例3 Container With Most Water,例3 Leetcode 11 一个数组ai表示数轴上i的位置有一条高度为ai的竖直的线段,把两条线段当作一个容器左右边的高度,问那两条线段组成的容器容积最大? 本质是求 i j, maxminai, aj * (j i) 算法两头扫: i = 0, j = n - 1, best = 0 i j best = max(best, minai, aj * (j i); if (ai aj) +i; else -j;,11/21,,例3 续1,12/21,,例3 续2,证明: 算法

5、一定扫过最优解 关键:如果一边移动到了最优解,另一边还没到最优解,没到的那边高度一定比最优解中较低的边低! (道理:因为x轴上宽度更宽) 无论高或者低的那边先到最优解,根据我们的“关键点”,另外那边一定比它还要低,算法会一直移动另外那边到最优解,而高的这边保持不动。,13/21,,例4 最大间隔问题,例4 给定数组a,求下标对i, j满足ai aj,并且j i最大。 分析: 假设目前最优解是d, 对于j,至少要检查i j d 1才可能更优 记录前缀最小值px = mina0x 倒着循环j,对于每个j看一下pj d 1是否= aj,用p “引导” 如果前面都比aj大,则这个j得不到更优的解,14

6、/21,,例4 续,,对best的理解,例5 01相等的串,例5 给定一个01串,求它一个最长的子串满足0和1的个数相等。 分析:把0看成 -1, 1当作1,还记得“前缀和”么? 需要两个前缀和相等,则这两个前缀和之间的子串满足0的个数和1的个数相等。 对前缀和排序? O(nlogn) 优化不需要排序 前缀和范围是-nn,我们加上n之后就是02n,只要记录第一次出现的位置,16/21,,例5 续,17/21,,本质: 用hash代替排序。 而当hash值是比较小的非负整数时, 可以用做数组下标,例6 二进制矩阵中1的个数,例6 给定n * n的01方阵,每一行都是降序的(即先连续的一段1,再连

7、续的一段0),求1最多的那行中1的个数? 分析: 算法1 数出每一行的1 复杂度O(n2) 算法2 二分出每一行0和1的分界线 复杂度O(nlogn) 算法3 如果某个位置时1,则向右,是0则向下 (我们只需要找到比本行更多的1才有意义!),18/21,,例6 续,19/21,,时间复杂度O(n),总结,其他问题和算法 最大子数组和 KMP (extend) Manacher 最大直方图 (单调堆栈) 滑动窗口最大值 (单调队列) 快排Partition过程 杨氏矩阵查找 荷兰国旗问题 First Missing Positive 排列组合相关 Next/Previous permutation 树相关 二叉树遍历、(最大、最小)深度、同构、镜像判断、平衡判断 多思考,多练习,20/21,,谢谢大家,更多视频尽在: http:/ 免费视频 直播课程 面试问答 Contact us:微博 七月算法 七月问答 曹鹏博士,21/21,,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 招聘面试

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报