IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> python leetcode3 -> 正文阅读

[数据结构与算法]python leetcode3

141. 环形链表

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

'''
    他让我判断是否有环:
        我的想法是:记录,记录,记录,用字典记录(这样查找方便些)
            --记录每个变量的内存地址,这样每次遍历的时候查找一遍不挺好?
            
'''
def fun1(head):
    dic={}
    while head:
        if head in dic:
            return True
        else:
            dic[head]=0#进入字典
        head=head.next
    return False

'''
    他让我用o(1)的空间复杂度,我应激反应出来了,双指针
    因为,只能一个方向所以一定是快慢指针? 嗯应该是这样
    那么如果没有环,直到head==None  slow和quick都不可能指向同一个节点
    如果有环,那么quick和slow是可以指向同一节点的
        --因为quick跑的太快又回来了
'''

'''
    重点:
        如何设计可以使有环的时候,quick一定可以追上slow
        这里可以看一下:floyd判环(圈)算法,我没详细看,反正就是一定能追上只要quick比slow快,且有圈
        就先理解成套圈吧
        
'''
p1=ListNode(1)
def fun2(head):
    if head == None or head.next == None:
        return False
    s = head
    q = head.next
    while q and q.next:  # 这里写个q是为了防止当前q是倒数第二个,然后q=q.next.next得到了None这样的话q.next会报错
        if q == s:
            return True
        q = q.next.next  # 跑两步
        s = s.next  # 跑一步

    return False
print(fun2(p1))

====================================================================================================================================================================================================================================
104. 二叉树的最大深度

'''
'''
    哈哈,这个题目我有印象,当时死搞搞了两个多小时,非要尼玛用栈模仿递归
'''



class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

'''
    广度优先遍历
        这种遍历就是,一层一层的遍历树,可以用队列来
'''
def fun1(root):#这个函数的运行结果和这个题目没什么关系,只是从上到下,从左到右进行输出而已
    duilie=[]
    while duilie or root:#当前节点不为空,或者
        if root.left:
            duilie.append(root.left)
        if root.right:
            duilie.append(root.right)
        print(root.val)
        root=duilie.pop(0)

def fun2(root):#这个的层次更加鲜明,循环里面嵌套循环,嵌套循环用来表示一层,然后顺带着可以算出最大深度
    if root==None:
        return 0
    duilie=[root]
    dade=[]
    while duilie:#队列不为空进来
        size=len(duilie)#获得当前队列长度,相当于一层的个数
        ls=[0]*size
        for i in range(size):
            node=duilie.pop(0)
            if node.left:
                duilie.append(node.left)
            if node.right:
                duilie.append(node.right)
            ls[i]=node.val
        #循环结束
        dade.append(ls)
    return len(dade)


'''
    既然是二叉树,递归就是不可或缺的一部分
    那我们来看看递归怎么做?
        --1+max(fun3(root.left),fun3(root.right))
        你不觉得很好吗?
            当前位置是一层+左子树或右子树的最大值,这样不就是最大深度
'''

def fun3(root):
    if root==None:
        return 0
    return 1+max(fun3(root.left),fun3(root.right))

====================================================================================================================================================================================================================================
98. 验证二叉搜索树

'''
    二叉搜索树的定义:
        --当前节点的左子树只含有小于当前节点的数
        --当前节点的右子树只含有大于当前节点的数
        --所有的左右子树也为二叉搜索树

    二叉搜索树有一个性质:
        中序遍历一定是有序的
    那么中序遍历有序,可不可以得到该二叉树是二叉搜索树
        可以
'''

'''
    方法一:
        先中序遍历,再判断是否为有序
    这个的时间复杂度怎么说呢
    中序遍历o(n)  排序o(n*logn)当然这里需要动的并不多,可以达到o(n)不过我不知道python排序的快速排序怎么写的
    比较o(n)
    时间复杂度:
        开了两个列表
'''

'''
    这里其实写,非递归的中序遍历更好,因为可以直接在这个过程中比较
'''
class Solution:
    def isValidBST(self, root) -> bool:
        ls=[]
        self.digui(root,ls)
        #这样ls里面的就是中序遍历的结果
        li=ls.copy()
        li.sort()
        for i in range(len(li)):
            if i+1<len(li) and li[i]==li[i+1]:
                return False#这里是因为它这个定义的二叉排序树不允许出现重复元素
            if li[i]!=ls[i]:
                return False
        return True

    def digui(self,root,ls):
        if root==None:
            return
        self.digui(root.left,ls)
        ls.append(root.val)
        self.digui(root.right,ls)

'''
    我觉得有一种相对上面这样写更好的方法,再遍历的过程中找到左子树的最大值,右子树的最小值,然后与当前节点比较
    哈哈哈,这是看答案写的不是很理解
    过程有点理不清了
    
'''
class Solution:
    def isValidBST(self, root) -> bool:
        return self.bianli(root,float('-inf'),float('inf'))
    def bianli(self,root,lower,upper):#这里是当前节点,左子树的最大值,右子树的最小值
        if root==None:
            return True
        val=root.val
        if not lower<val<upper:
            return False#我可以直接return掉
        if not self.bianli(root.left,lower,val):
            return False#该当前节点的左子树了
        if not self.bianli(root.right,val,upper):
            return False
        return True

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:45:19  更:2021-10-11 17:46:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:43:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码