左神初级算法课程第四讲笔记-设计宏观结构和链表

问题一:猫狗队列问题

猫狗队列问题

问题二:矩阵旋转打印

矩阵旋转打印

思路:每次打印一个框,然后依次缩小

问题三:旋转正方形

旋转正方形

思路:还是每次旋转一个框,和上一题思路一样

问题四:“之”字打印矩阵,要求额外空间复杂度为O(1)

“之”字打印矩阵

思路:设计宏观结构,和上两题差不多

牛啊真没想到还能这样

问题五:在行列排好序的矩阵(行有序列也有序)中找数,时间复杂度O(N+M),从左下或者右上出发

问题六:打印两个有序链表的公共部分,类似外排merge

打印两个有序链表的公共部分

链表问题最优解来自空间复杂度,笔试越快愈好可以申请额外空间,面试的话要注重空间复杂度,聊的时候多聊好的方法

问题七:判断链表是否回文结构

判断链表是否回文结构

简单方法:用一个栈得到逆序,依次比较,或者用双指针得到后半段的逆序(还是用栈)和前半段比较,这样笔试可以,但空间复杂度还是O(N)

面试方法:双指针找中点,然后后半段反向(记住最后还要把链表改回来),这样空间复杂度就是O(1)

问题八:链表的荷兰国旗问题

链表的荷兰国旗问题

简单解法:用数组做,最后还原链表

进阶要求:实现稳定性,时间复杂度做到O(N),额外空间复杂度O(1),思路是用三个节点,遍历链表依次往后串,最后把三个链表串在一起

问题九:复制含有随机指针节点的链表

复制含有随机指针节点的链表

思路:先拷贝原有的next路线的链表,把每个节点和复制的节点塞到map中,利用map找复制链表的next和rand节点,这样空间复杂度是O(N)

改进方法:

改进方法

/*重要*/问题十:两个链表相交问题,注意单链表

两个链表相交问题

如何判断单链表是否有环:set,不用set就准备两个指针fast和slow,分别走两步和一步,如果有环fast和slow会相遇,此时fast回到head改成一次走一步,这样fast和slow会在起环处(loop)相遇,在找到是否有环后:

①两个链表都无环:链表1放到set,遍历链表2查有没有重复,不用set的话先遍历链表1找到最后节点和链表1长度,链表2也这样做,然后比较两个链表最后节点是否是一个,如果是一个说明中间会汇入一条链表(单链表),让较长的链表从长度差值处出发遍历两个链表,肯定能找到相遇点

②一个无环,一个有环:不可能相交

③两个都有环:三种拓扑

三种拓扑

loop1==loop2:第二种结构

loop1!=loop2:第一或三种结构,如何区分:让loop1以next一直往下走,遇到loop2就是第三种,否则第一种

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。