刷leetcode的一些经典算法的记录

本文深入解析树和链表的经典算法,包括树的遍历、链表反转、二叉树转换等,通过具体实例讲解算法原理与实现技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

283. Move Zeroes

        #这个算法nb了
        zero = 0  # records the position of "0"
        for i in range(len(nums)):
            if nums[i] != 0: #如果该位置不是0
                nums[i], nums[zero] = nums[zero], nums[i]
                zero += 1

 

219. Contains Duplicate II

        #给定一个数组,和一个整数k,判断该数组中是否存在不同下标的 i 和 j 两个元素,
        #使得 nums[i] = nums[j],且 i 和 j 的差不超过k。
        dic = {} #建一个字典 key为值 value为index 
        for i, v in enumerate(nums): #枚举数据
            if v in dic and i - dic[v] <= k:#如果v在字典中并且 dic[v]表示的是index
                return True
            dic[v] = i
        return False

 

989. Add to Array-Form of Integer

        #完成int与str之间的互相转化 注意map与list函数的混合使用

        def list2int(l):
            s = list(map(str, l)) #将列表l中的每个元素变成str类型
            s = ''.join(s)
            return int(s)
        
        def int2list(i):
            s = str(i) 
            return list(map(int, s))
        
        return int2list(list2int(A) + K)
 

108. Convert Sorted Array to Binary Search Tree   经典,重在学习如何递归构造树

 class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        #已经排好序 那么选中间节点作为root 左侧为左树 右侧为右树
        #如果长度为0 则返回None
        if len(nums) == 0:
            return None
        return self.makeTree(nums,0,len(nums)-1)
    def makeTree(self,num,start,end):
        #如果start>end,则返回None
        if start > end:
            return None
        #如果start==end的话,则mid == start == end ,在下一个循环中 其left与right被设置为None
        mid = start + (end - start) // 2
        node = TreeNode(num[mid])
        node.left = self.makeTree(num,start,mid-1)
        node.right = self.makeTree(num,mid+1,end)
        return node 
        

107. Binary Tree Level Order Traversal II  #经典求树的每一层,并反向输出

        if not root:
            return []
        stack = []
        queue = [root]
        while queue:
            tempQueue = []
            level = []
            for node in queue:
                level.append(node.val)
                if node.left:
                    tempQueue.append(node.left)
                if node.right:
                    tempQueue.append(node.right)
            stack.append(level)
            queue = tempQueue
        return stack[::-1]

#226. Invert Binary Tree 

        if root is None:
            return
        
        root.left, root.right = root.right, root.left
        
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root

206. Reverse Linked List

        #这个链表超级有意思  相当于加了一个小尾巴
        prev = None
        while head:
            curr = head
            head = head.next
            curr.next = prev
            prev = curr
        return prev

 

617. Merge Two Binary Trees

 

    def mergeTrees(self, t1, t2):
        """
        :type t1: TreeNode
        :type t2: TreeNode
        :rtype: TreeNode
        """
        #以一棵树为基准 ,另一棵树用来比较
        
        if not t1:
            return t2
        if not t2:
            return t1
        t = TreeNode(t1.val+t2.val)
        t.left = self.mergeTrees(t1.left, t2.left)
        t.right = self.mergeTrees(t1.right, t2.right)
        return t

897. Increasing Order Search Tree

    def increasingBST(self, root: TreeNode) -> TreeNode:
        
        res=[]
        def preorder(node):
            if node:
                preorder(node.left)
                res.append(node.val)
                preorder(node.right)
                
        preorder(root)
        print(res)
        tree=TreeNode(res[0])
        res=res[1:]
        new_root=tree
        for elem in res:
            tree.right=TreeNode(elem)
            tree=tree.right
        return new_root

949. Largest Time for Given Digits

    def largestTimeFromDigits(self, A: List[int]) -> str:
        #从四个数字里 分别找2与1与0的最大值,接下来的三个值中找4,3,2,1,0,再从两个数中找6,5,4,3,2,1,
        #再从一个数放在最后,如果倒数第二个数字为0,那么最后一个不为0的话,则返回‘’
        #当然最好这样遍历两个数,一个小于等于24,另一个等于60的最大值
        #first way
        k = sorted(list(itertools.permutations(A)),reverse=True)
        print(k)
        for i in k:            
            a,b,c,d = i
            su = (a*10+b)
            sd = (c*10+d) 

            if su < 24 and sd <60:
                return  f"{a}{b}:{c}{d}"  
        return ''
    
        #second way
        return max(["%d%d:%d%d" % t for t in itertools.permutations(A) if t[:2] < (2, 4) and t[2] < 6] or [""])

 

205. Isomorphic Strings

 

    def isIsomorphic(self, s: str, t: str) -> bool:
        #third way (失败)
        #return map(s.find, t) == map(t.find, s)  这个失败了
        
        #second way  zip  打包为元组的列表 "egg" 'add" 变成[(e,a),(g,g),(g,g)] set(s) 变成eg   set(t) 变成了ag
        return len(set(zip(s, t))) == len(set(s)) == len(set(t))
        #first way #这个方式要记住
        d1, d2 = {}, {}
        for i, val in enumerate(s):
            d1[val] = d1.get(val, []) + [i]    #d1 = {'e': [0], 'g': [1, 2]}
        for i, val in enumerate(t):
            d2[val] = d2.get(val, []) + [i]
        return sorted(d1.values()) == sorted(d2.values())

28. Implement strStr()

    def strStr(self, haystack: str, needle: str) -> int:
        #这尼玛  方法真的牛逼
        for i in range(len(haystack) - len(needle)+1):
            if haystack[i:i+len(needle)] == needle:
                return i
        return -1
        
        #这题有点动态规划的感觉,做试试  myway   has some problems
        array = [[0]*(len(haystack)+1)]*(len(needle)+1)

        for i in range(1,len(haystack)+1):
            for j in range(1,len(needle)+1):
                
                if haystack[i-1] == needle[j-1]:
                    print(i,j)
                    array[j][i] = array[j-1][i-1] + 1
                else:
                    array[j][i] = max(array[j][i-1],array[j-1][i])
        res = -999
        print(array)
        for i in array:
            res = max(res,max(i))
        if res == len(needle):return res
        else:return -1


        
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值