剑指offer--algorithm11

菜根谭--摘录续

量宽福厚 器小禄薄

仁人心地宽舒,便福厚而庆长,事事成个宽舒气象;鄙夫念头迫促,便禄薄而泽短,事事得个迫促规模。

情急招损 严厉生恨

事有急之不白者,宽之或自明,毋躁急以速其忿;人有操之不从者,纵之或自化,毋躁切以益其顽。

有些事情在很短的时间内想弄明白很困难,可是宽限一些时间 也许就明白了,所以遇事不要急躁,以免增加紧张的气氛;有 些人不容易引导,如果放松对他的约束,也许他会被感化,所以不 要急切地4约籴别人,以免增加对方的抵触情绪。
切忌浮躁!
切忌浮躁!
切忌浮躁!

性躁无成 平和集福

性躁心粗者一事无成,心和气平者百福自集。

题22--二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

本题的思路如下


image.png

image.png

image.png

下面为代码和注释部分

class tree(object):
    def __init__(self,value):
        self.value=value 
        self.left=None 
        self.right=None 
        
        
class solution(object):
     def path_to_num(self,root,num):#两个参数,第一个为根节点,第二个为给出的数字
         if not root:
             return []#边界情况1
         if root.left==None and root.right==None:
             if num==root.value:
                 return [[root.value]]
             else:
                 return []#第二种边缘情况
         stack=[]#用于存放路径
         left=self.circle_path(root.left,num-root.value)#先从左边节点开始
         for i in left:#去掉一层,变为单层列表
             i.insert(0,root.value)#在0的索引位置上插入一个根节点
             stack.append(i)#然后把整个路径再放回到stack 里
         right=self.circle_path(root.right,num-root.value)#再从右边节点开始
         for j in right:
             j.insert(0,root.value)
             stack.append(j)
         return stack       
     def circle_path(self,root,num):#本质上该函数的root
         if not root:
             return []#依旧是边界情况
         if root.left==None and root.right==None:#说明到了叶节点,也是一种边界情况
             if num==root.value:
                 return [[root.value]]
             else:
                 return []
         a=self.circle_path(root.left,num-root.value)+self.circle_path(root.right,num-root.value)#circle_path 方法本质上返回的就是一个双层的列表,因此可以合并
         """
         本题的路径是单向性的贯穿到底,不会即含有左节点,又含有右节点
         这也是为什么会有返回空列表的设定
         """
         return [[root.value]+i for i in a]
        
        
         
    

def main():
    node1=tree(10)
    node2=tree(5)
    node3=tree(12)
    node4=tree(4)
    node5=tree(7)
    
    node1.left=node2
    node1.right=node3
    node2.left=node4
    node2.right=node5
    s=solution()
    print (s.path_to_num(node1,22))
    
    
if __name__=='__main__':
    main()

本题的关键就在于递归的使用和理解,需要好好的掌握递归的使用

题23--复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,
一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。

本题涉及到一个节点的两个指针,一个为p_next,一个为p_silbling指针,解决该题,最优的程序设计思路,就是要考虑到时间的复杂度,书中关于一般思路和优化思路的时间复杂度有如下的描述


image.png

image.png

image.png

image.png

最后一步就是将一个由原链表和复制的链表组成的链表,拆分为两个链表


image.png

下面为程序代码和注释部分,本题还是比较复杂的,需要慢慢体会和理解

class complex_node(object):
    def __init__(self,value):
        self.value=value
        self.next=None
        self.random=None#随意指针


class solution(object):
    def renode(self,node):
        if node==None:
            return None
        self.dup(node)
        self.random_next(node)#此时得到的链表已经是新旧连接的链表了
        self.denode(node) #通过上述的三步实现调用
        
        
    def dup(self,node):#该函数的用途是将原来链表的next指针结构进行复制,并且串联,效果为1--1'--3--3'--5--5'
        pnode=node#实例化一下
        while pnode:#开始循环
            pcloned=complex_node(0)#里面的数字为多少不重要,这一步的意义就是实例化声明一个节点
            pcloned.value=node.value
            pcloned.next=node.next#通过上述的两步进行了复制
            pnode.next=pcloned#实现新旧的连接,实际就是1--1'
            pnode=pcloned.next #进行重新的赋值,开始下一轮的循环
            
            
            
    def random_next(self,node):#该函数的目的实现random节点的连接
        pnode=node#实例化
        while pnode:
            pclone=pnode.next#先进行复制节点的声明
            if pnode.random!=None:
                pclone.random=pnode.random.next#作用就是将1'和5'连接起来了
            pnode=pclone.next#以便于进行第二次的循环
        
    def denode(self,node):#将新旧的两个链表进行拆分
        pnode=node#还是进行一个实例化的声明
        p1=p2=pnode.next#声明p1,p2的作用就起到拆分新旧链表的桥梁作用
        pnode.next=p1.next#此时1--3
        pnode=pnode.next
        
        while pnode:#此时pnode为3节点
            p2.next=pnode.next#此时1'--3'
            p2=p2.next#进行推移,此时p2为3'
            pnode.next=p2.next#此时3--5
            pnode=pnode.next#进行下一次循环
        return p2
        
        
            
            
            
        
        
        
        

def main():
    node1=complex_node(1)
    node2=complex_node(3)
    node3=complex_node(5)
    node1.next=node2
    node2.next=node3
    node1.random=node3
    s=solution()
    clonenode=s.dup(node1)
    print (clonenode.random.value)
    
    
    

if __name__=='__main__':
    main()

心如止水 方能气贯长虹

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 2,893评论 0 1
  • 链表 记录《剑指offer》中所有关于链表的题目,以及LeetCode中的相似题目 相关题目列表 题目 链表是面试...
    wenmingxing阅读 1,147评论 0 11
  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 10,190评论 0 5
  • 树 记录《剑指offer》中所有关于树的题目,以及LeetCode中的相似题目。 相关题目列表 题目 树是一种最常...
    wenmingxing阅读 1,400评论 2 13
  • 仔细观看,你会发现,不同的人走路姿势很有意思,反应了不一样的性格! 我一个人坐在花城汇广场一旁的座椅上,看着眼前的...
    学习笔记88阅读 1,319评论 0 0