July_algorithm 1.链表栈队列.pdf
《July_algorithm 1.链表栈队列.pdf》由会员分享,可在线阅读,更多相关《July_algorithm 1.链表栈队列.pdf(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、链表、栈与队列七月算法邹博2015年10月17日10月算法在线班2/总论 算法包罗万象 推理、逻辑、“机智”演绎、归纳、类比 严格归纳 算法是脑力的游戏 合理运用算法,能够获得更高的效率 时间复杂度优先 空间复杂度优先 时间复杂度和空间复杂度的折中10月算法在线班3/系统的“数数”围棋棋盘由横纵19*19条线组成,这些线共组成多少个正方形?思路:边长为1的正方形多少个?边长为2的呢?边长为3、4的呢?以某点为右下角的正方形有多少个?把所有点的正方形相加。系统的遍历不漏不重:深度优先搜索、广度优先搜索前序遍历、中序遍历、后序遍历思考:给定N个数和某定值sum,从N个数中取若干个数,要求它们的和是
2、sum,输出所有的取法。子集和数问题10月算法在线班4/机智:“战平即可出线”足球比赛,一个小组有8支球队进行单循环赛,胜者得3分,平得1分,负不得分,积分最高的4支出线,则出线至少需要_分,未出线最多可能有_分。10月算法在线班5/战况分析 8支球队中,3支强队各自战胜其他5支弱队,而5支弱队之间比赛全部战平。则5支弱队中积分全部是4分,可以采用净胜球或抽签选5支弱队中的1支作为第4名出线。8支球队中,5支强队假定为甲、乙、丙、丁、戊,他们各自战胜其他3支弱队,同时,5支强队之间的战况为:甲战胜乙丙,乙战胜丙丁,丙战胜丁戊,丁战胜戊甲,戊战胜甲乙,则这5支强队同时胜5场,输2场,同积15分。
3、可以采用净胜球或抽签选5支强队中的1支作为第5名而被淘汰。10月算法在线班6/逻辑推理:完形填空 皇帝不是穷人,在守财奴之中也有穷人,所以,有一些_并不是_。10月算法在线班7/使用离散数学分析该题目 p:这个人是皇帝 q:这个人是穷人 r:这个人是守财奴 皇帝不是穷人:pq 在守财奴之中也有穷人:x(xr xq)10月算法在线班8/分析过程 r:这个人是守财奴 p:这个人是皇帝 有一些 守财奴 并不是 皇帝。本题的思想,在分支限界中将再次遇到。10月算法在线班9/系统:字符串表达式的计算 a+b*(c-d)+e 朴素算法 逆波兰表达式 栈的典型应用10月算法在线班10/天平与假币 现在有16
4、枚外形相同的硬币,其中一枚是假币,且已知假币比真币重量轻。先给定一架没有砝码的天平,问至少需要多少次称量才能找到这枚假币?思考:给出一种称量方案容易,但如何证明这种方案用到的称量次数最少呢?10月算法在线班11/解析 将16枚硬币分成A:5枚、B:5枚、C:6枚3堆。先用天平称量A和B,若A(或者B)轻,则可以通过两次称量找出5枚中的轻者;若A、B平衡,仍然可以通过两次称量找出C:6枚中的轻者。找5枚或者6枚中的1枚轻者,可以任选4枚,天平两端各放两枚,无论平或者不平,都能够再用1次称量找到轻者。10月算法在线班12/理论下界 既然一次天平称量能得到左倾、右倾、平衡3种情况,则把一次称量当成一
5、位编码,该编码是3进制的。问题转换为:需要多少位编码,能够表示16呢?答:假定需要n位,则:3n16 取对数后计算得到n2.52,这表示至少3次才能找到该轻质的假币。思考:快速排序的Partition过程。10月算法在线班13/本次主要内容链表链表相加链表部分翻转链表划分链表去重堆栈括号匹配最长括号匹配计算逆波兰表达式队列最短路径条数拓扑排序思考题:直方图矩形面积/收集雨水问题10月算法在线班14/链表相加 给定两个链表,分别表示两个非负整数。它们的数字逆序存储在链表中,且每个结点只存储一个数字,计算两个数的和,并且返回和的链表头指针。如:输入:243、564,输出:70810月算法在线班15
6、/问题分析 输入:2-4-3、5-6-4,输出:7-0-8 因为两个数都是逆序存储,正好可以从头向后依次相加,完成“两个数的竖式计算”。10月算法在线班16/Code10月算法在线班17/说明 因为两个数字求和的范围是0,18,进位最大是1,从而,第i位相加不会影响到第i+2位的计算。在发现一个链表为空后,直接结束for循环。最后只需要进位和较长链表的当前结点相加,较长链表的其他结点直接拷贝到最终结果即可。没有提高时间复杂度,trick而已。10月算法在线班18/链表的部分翻转 给定一个链表,翻转该链表从m到n的位置。要求直接翻转而非申请新空间。如:给定12345,m=2,n=4,返回1432
7、5。假定给出的参数满足:1mn链表长度。10月算法在线班19/分析 空转m-1次,找到第m-1个结点,即开始翻转的第一个结点的前驱,记做head;以head为起始结点遍历n-m次,将第i次时,将找到的结点插入到head的next中即可。即头插法10月算法在线班20/Code10月算法在线班21/链表划分 给定一个链表和一个值x,将链表划分成两部分,使得划分后小于x的结点在前,大于等于x的结点在后。在这两部分中要保持原链表中的出现顺序。如:给定链表143252和x=3,返回122435。10月算法在线班22/问题分析 分别申请两个指针p1和p2,小于x的添加到p1中,大于等于x的添加到p2中;最
8、后,将p2链接到p1的末端即可。时间复杂度是O(N),空间复杂度为O(1);该问题其实说明:快速排序对于单链表存储结构仍然适用。注:不是所有排序都方便使用链表存储,如堆排序,将不断的查找数组的n/2和n的位置,用链表做存储结构会不太方便。10月算法在线班23/Code10月算法在线班24/排序链表中去重 给定排序的链表,删除重复元素,只保留重复元素第一次出现的结点。如:给定:233578889910 返回:2357891010月算法在线班25/问题分析 若p-next的值和p的值相等,则将p-next-next赋值给p,删除p-next;重复上述过程,直至链表尾端。10月算法在线班26/Cod
9、e10月算法在线班27/Code2 分析该代码的正确性10月算法在线班28/排序链表中去重2 若题目变成:若发现重复元素,则重复元素全部删除,代码应该怎么实现呢?如:给定:233578889910 返回:2571010月算法在线班29/Code10月算法在线班30/小结 可以发现,纯链表的题目,往往不难,但需要需要扎实的Coding基本功,在实现过程中,要特别小心next的指向,此外,删除结点时,一定要确保该结点不再需要。小心分析引用类型的指针。10月算法在线班31/stack 堆栈是一种特殊的线性表,只允许在表的顶端top进行插入或者删除操作,是一种操作受限制的线性表。栈元素服从后进先出原则
10、 LIFOLast In First Out10月算法在线班32/括号匹配 给定字符串,仅由()六个字符组成。设计算法,判断该字符串是否有效。括号必须以正确的顺序配对,如:“()”、“()”是有效的,但“()”无效。10月算法在线班33/以下算法是否可行 对于给定的字符串str0N-1,它的前缀串str0k小括号的左括号减去小括号的右括号的数目,记做p0;同理使用p1、p2记录中括号和大括号的信息 思路:将k从0到N-1遍历:对于0kN-2:p00、p10,p20 对于k=N-1,p0=0、p1=0,p2=0 则字符串括号匹配,否则,不匹配。10月算法在线班34/算法分析 在考察第i位字符c与
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- July_algorithm 1.链表栈队列 链表栈 队列
限制150内