Day76_0204
专注时间:目标是:5h30~6h。实际:5h32min。1.调整学习路线;2.调整算法学习方法;3.重视工程能力。
每日任务: 饭后的休息(25min),学习间歇的休息(15min)都用手表计时器来监督
{step1} 40min =二刷 1 道力扣hot100 +昨天的题再做一遍 (如果是hard,只做一道就好 , 完成情况及时长: 二刷昨日题目:min,今日题目: min );【学习资源:PyTorch官方文档:https://docs.pytorch.ac.cn/tutorials/beginner/basics/intro.html】1.5h=PyTorch工程实操(完成情况及时长: 0。把第二个pytorch网页的"局部禁用梯度计算"看懂,就去看第一个pytorch网页 ); {step4} 1h=周志华机器学习(完成情况及时长: 0min ); {setp3} 1.5h+(claude的《RL4LLM》+《Claude Opus 4.5深度思考RLHF学习路径》学习路径,时长: min ) ; {step2,计网考纲复习+模式识别复习} 3h =计算机网络考纲题目背诵] (完成情况及时长:);
学完机器学习,然后是深度学习。学完PyTorch,之后是Transformer与大模型架构(见Gemini3pro生成的阶段2)。学快一点。准备一个GitHub Repo把所有手撕过的算法整理进去,这会是最好的复习资料。
必须熟记的API、最简洁的GPT实现、带注释的Transformer实现、推荐系统模型库(包含主流模型实现)还有"Let's build GPT"系列学习视频见Claude的第20页。 冰哥听讲座,老师说: GPT是最好的老师,不需要其他家教,清华学生智商120,GPT有140。多用大模型来帮助学习。
学习内容:力扣(50+45+32)、华为题目看了一两道(12)、ML(logit代码)、调研搜集就业方向和学习路径
总结与心得:偷懒了几天,今天也有做的不好的地方:每顿饭后/健身回来后都是拖很久才学习,而且只学了3个专注周期,而且看游戏比赛直播和刷抖音占了很多时间,明天改改,依旧是逼自己学15分钟,进入状态之后就可以了。然后要达到每天的专注时长目标,今天刷到华为AI岗的线上题目,不管是算法题还是八股,都有难度和门槛,DL岗位也考察ML,所以这学期ML没白学,但是没能并行地学习DL,比较遗憾。道阻且长,如果一天一天的荒废,3年下来也就那样了。觉得困就去房间睡,不困就学到15.00再睡,不要找状态不好的借口躺着。之前在宿舍都没法专心学习,后来可以了,在家学习应该也是能最终做到的。整理学习路线时候发现AI给的路线不靠谱不实际也不成体系,然后就不知道该走什么方向,学什么方向,找了很久,终于找到合适靠谱的博主分享的学习路线,长舒了一口气。明天重新整理。
《41.缺失的第一个正数》
python
class Solution(object):
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#可以推断出答案在1到len(nums)+1之间。
#用原地数组哈希,我们只关心数组中1到len(nums)有没有出现,映射:num(key)->nums-1(idx)
#若映射完后,顺序遍历nums,nums[i]!=i+1,则为答案。若1到len(nums)都出现了,答案就是n+1
n = len(nums)
#这样写有个问题,顺序遍历时候会把后面待处理的元素交换到前面来,而顺序遍历是不回头的,待处理元素就一直得不到处理,从而出错。既然是放置,可以用while和指针,指针前面的位置表示已经放置好,while 指针==len(nums)就可以退出循环了。也不对,如果我已经知道了哪里没放置好,答案也早就有了。
#核心改进:对每个索引 i,用 while 循环持续处理,直到当前 i 位置的元素要么不在 1~n 范围内,要么已经放到了正确的位置上,再移动到下一个索引 i,这样就不会遗漏交换后新出现的待处理元素。
for i in range(n):
#该数在范围内,需要被映射放置;该数不在范围内,不需要处理
#如果有重复的数,并且该数在范围内,就会死循环
while 0<=nums[i]-1<=n-1 and nums[i]!=nums[nums[i]-1]:
nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1]
#时间复杂度应该是多少呢?每个元素至多被交换一次,且遍历一次。所以是o(n)
for i in range(n):
if nums[i]!=i+1:
return i+1
#不要漏解
return n+1
《33.搜索旋转排序数组》
python
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
#有点像快速排序的变体快速选择?根据区间的两个端点值与target的大小比较,来确定所需要进一步搜索的区间
#如果左端点比右端点大,说明当前区间不是一个单增的区间,而是有两个单增的区间。然后比较端点和target的大小来选区间。这样还是o(n),因为找答案所在区间是o(n)
def erfen(nums,l,r,target):
while l<r:
mid = (l+r)//2
if nums[mid]>=target:
r = mid
else:
l = mid+1
return l
l,r = 0,len(nums)-1
while nums[l]>nums[r] and target<=nums[r]:
l+=1
while nums[l]>nums[r] and target>=nums[l]:
r-=1
res=erfen(nums,l,r,target)
return res if nums[res] == target else -1
python
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
#既然是二分的变式,那么先考虑正常二分过程,分析该过程能从哪些地方改进
#在二分时候mid将区间一分为二,[l,mid] [mid+1,r]那么一定有一边的区间是有序的,或者两边的区间都有序。
#根据有序的那个部分确定我们该如何改变二分查找的上下界[l,mid-1] [mid] [mid+1,r] if nums[mid]==target,return mid
if len(nums) == 1:
return 0 if nums[0]==target else -1
l,r = 0,len(nums)-1
#因为有if nums[mid]==target的判断所以要l<=r
while l<=r:
mid = (l+r)//2
if nums[mid] == target:
return mid
#左边区间有序,不能漏取等号,太多细节了
if nums[l]<=nums[mid]:
#答案在左半边,所以动r
if nums[l]<=target<nums[mid]:
r = mid-1
#答案不在这个区间,动l来抛弃这个区间
else:
l = mid+1
#右边区间有序
else:
if nums[mid]<target<=nums[r]:
l = mid+1
else:
r = mid-1
return -1
《34.在排序数组中查找元素的第一个和最后一个位置》
python
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
if not nums:
return [-1,-1]
#或者这样记忆?mid\mid+1,找的是mid,在mid+1的左边,所以是左边界
#mid/mid-1。mid在右边,所以是右边界
def Lidx(nums,target):
l,r = 0,len(nums)-1
while l < r:
mid = (l+r)/2
#遇到大于等于target的都要去找左边的区间,所以是找左边界。
if nums[mid]>=target:
r = mid
else:
l = mid+1
return l if nums[l]==target else -1
def Ridx(nums,target):
l,r = 0,len(nums)-1
while l<r:
mid = (l+r+1)/2
#遇到小于等于target的都要把去找右边的区间,所以是找右边界。
if nums[mid]<=target:
l = mid
else:
r = mid-1
return l if nums[l]==target else -1
return [Lidx(nums,target),Ridx(nums,target)]