学习日记day48

Day48_1211

专注时间:6H33min,破纪录了,非常好

每日任务:1h=二刷2道力扣hot100(如果是hard,只做一道就好 完成情况及时长: 1.5 );【学习资源:PyTorch官方文档:https://docs.pytorch.ac.cn/tutorials/beginner/basics/intro.html】1.5h=PyTorch工程实操(完成情况及时长: 40 );1h=周志华机器学习(完成情况及时长: 0 );【按照Claude的路线】1h=手撕机器学习算法(完成情况及时长: ?? );计算机网络45分钟(完成情况及时长: ??

学完机器学习,然后是深度学习、搜广推经典模型(也有很多要手撕的,见Claude生成的)。学完PyTorch,之后是Transformer与大模型架构(见Gemini3pro生成的阶段2)。学快一点,学完还要做搜广推的实战项目。准备一个GitHub Repo把所有手撕过的算法整理进去,这会是最好的复习资料。

必须熟记的API、最简洁的GPT实现、带注释的Transformer实现、推荐系统模型库(包含主流模型实现)还有"Let's build GPT"系列学习视频见Claude的第20页。

学习内容: 如上

总结与心得:算法题花太多时间了,没事,已经克服了(成功做完,完美吸收知识点)继续加油!

《138.随机链表的复制》

这个解法要注意恢复链表的语法逻辑,见第三个while

python 复制代码
"""
# Definition for a Node.
class Node:
    def __init__(self, x, next=None, random=None):
        self.val = int(x)
        self.next = next
        self.random = random
"""
class Solution(object):
    def copyRandomList(self, head):
        """
        :type head: Node
        :rtype: Node
        """
        #S3: 先创建:A-copyA-B-copyB-null
        #然后再断开。这样copy next就接上了,但是random该怎么复制呢?根据断开之前的数据结构特性copy的random = cur.random.next。那这样是不是要遍历三趟?还真是
        if not head:
            return head
        p = head
        while p:
            cp = Node(p.val)
            tmp = p.next
            p.next = cp
            cp.next = tmp
            p = p.next.next
        
        p = head
        while p:
            if p.random is None:
                p.next.random = None
            else:
                p.next.random = p.random.next
            p = p.next.next

        copy_head = head.next 
        p = head
        while p:
            cp = p.next
            p.next = cp.next
            p = p.next
            if p:
                cp.next = p.next
        return copy_head
        

哈希真是巧妙map{node2copynode}

python 复制代码
"""
# Definition for a Node.
class Node:
    def __init__(self, x, next=None, random=None):
        self.val = int(x)
        self.next = next
        self.random = random
"""

class Solution(object):
    def copyRandomList(self, head):
        """
        :type head: Node
        :rtype: Node
        """
        #之前的想法是错误的,应当是第一趟存哈希map(仅复制VAL),第二趟再去复制next和random,因为第一趟已经建立了映射,第二趟复制next,random时候就不会出现找不到的情况。核心还是map {原节点,复制节点}
        if not head:
            return head
        node2copy_map = {}
        p = head
        while p:
            node2copy_map[p] = Node(p.val)
            p = p.next
        p = head
        #当遇到两种场景时,代码会报错:
        #原节点是链表最后一个节点 → p.next = None → node2copy_map[p.next] 等价于 node2copy_map[None],
        #但  None 不在哈希表中;
        #原节点的 random = None → node2copy_map[p.random] 等价于 node2copy_map[None],同样触发 KeyError。
        #而你写的 if node2copy_map[p.next] else None 是先访问 key 再判断,此时已经触发 KeyError,判断逻辑根本没机会执行。
        #字典的 dict.get(key, default) 方法是「安全访问」:
        #若 key 存在,返回对应值;
        #若 key 不存在,返回 default(这里设为 None)
        while p:
            node2copy_map[p].next = node2copy_map[p.next] if p.next else None
            node2copy_map[p].random = node2copy_map.get(p.random,None)
            p = p.next
        return node2copy_map[head]
        

递归要自己去写,边写变想,空想是很难写的,我现在(第二天再写一遍试试)

python 复制代码
"""
# Definition for a Node.
class Node:
    def __init__(self, x, next=None, random=None):
        self.val = int(x)
        self.next = next
        self.random = random
"""

class Solution(object):
    def __init__(self):
        self.Node2copy_node = {}
    def copyRandomList(self, head):
        """
        :type head: Node
        :rtype: Node
        """
    #S1:如果两趟遍历,第一趟不管random,第二趟处理。那么:怎么根据原来节点的random 去找复制节点该指向哪个random?
        #还需要继续去思考两趟遍历的做法:原链表跳到random,然后按next走直至next = None,这样就定位了random。
    #S2:顺序遍历,如果发现该节点的random节点还未被复制,则先复制;*对于其next也是这样*
        #其实应当想到递归:发现某个节点的next,random不存在,则递归地创建相应的节点
        #为什么我没做出来:想到了哈希,但是用错了数据结构,不能用set,否则找不到指向关系。
        #应该用map{原链表Node->copy_Node} 而不是原链表之间的映射。因为我们只想知道原链表的某个节点是否已经被复制
    #S3:A->Acopy->B->Bcopy->C->Ccopy->null
            #依旧是感觉逻辑和语句复杂无从下手

    #S2怎么递归???
        #终止条件:空节点
        if not head:
            return None
        #边界条件:已经复制过
        if head in self.Node2copy_node:
            return self.Node2copy_node[head]
        
        copy = Node(head.val)
        self.Node2copy_node[head] = copy
        copy.next = self.copyRandomList(head.next)
        copy.random = self.copyRandomList(head.random)
        #会一直往深处走,去复制链表。那么最终return copy就实现了"返回复制链表的头结点"
        return copy

3个关于归并排序的题目。3个题都是模版

《912.排序数组》

python 复制代码
class Solution(object):
    def sortArray(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        def merge_sort(arr):
            if len(arr)<=1:
                return arr
            mid = len(arr)//2
            left = merge_sort(arr[:mid])
            right = merge_sort(arr[mid:])
            return merge(left,right)
        def merge(left,right):
            res = []
            l = r = 0
            while l<len(left) and r<len(right):
                if left[l]<=right[r]:
                    res.append(left[l])
                    l+=1
                else:
                    res.append(right[r])
                    r+=1
            res+=left[l:]
            res+=right[r:]
            return res
        return merge_sort(nums)
        

《148.排序链表》

python 复制代码
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def sortList(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        def merge_sort(head,tail):
            if not head:
                return head
            #这里一定要把head和tail断开 不然会死循环。
            if head.next == tail:
                head.next = None
                return head
            #找到链表中点,把这个模版积累下来
            slow = fast = head
            while fast!=tail:
                slow = slow.next
                fast = fast.next
                if fast != tail:
                    fast = fast.next
            #slow就是中点
            mid = slow 
            return merge(merge_sort(head,mid),merge_sort(mid,tail))
        
        def merge(head1,head2):
            #合并两个有序链表
            dummyhead = ListNode(0)
            res = dummyhead
            p,q= head1,head2
            #一定要记得去移动res指针
            while p and q:
                # '<=' 保证归并排序的稳定性
                if p.val <= q.val:
                    res.next = p
                    p = p.next
                else:
                    res.next = q
                    q = q.next
                res = res.next
            if p:
                res.next = p
            else:
                res.next = q
            return dummyhead.next
        return merge_sort(head,None)

        
python 复制代码
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def sortList(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        n=[]
        p=head
        if not p or not p.next:
            return p
        while p:
            n.append(p.val)
            p=p.next
        n.sort()
        nh=ListNode(n[0])
        p=nh
        for i in range(len(n)-1):
            p.next=ListNode(n[i+1])
            p=p.next
        return nh
        
相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习