学习日记day38

Day38_1128

专注时间:6h24min

每日任务:计算机网络50分钟( 2H20 分钟 ,听不懂了,下次直接刷网课或者力扣吧或者 REC,除非是孙老师的课 ),搜广推90分钟~上不封顶+手撕目录里的算法(0),二刷hot100算法题2道(完成 2 道),刑法实务考试复习50分钟(0)

学习内容: 马马虎虎

总结与心得: 老问题REC投入得少

《42.接雨水》

python 复制代码
class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        #暴力,按列算。没想到这个:难受了------------每个位置的水量 = min(左最大高度,右最大高度)**该位置柱子高度 取大于0进行累加。
        #还是不知道怎么按行去计算,先看看自己的题解笔记
        #现在先对暴力做法做优化,其实就是优化求lmax和rmax的计算
            #1.lmax(list),rmax(list)
            #2.只在乎 左右最大高度中的最小者,双指针优化
        if len(height)<3:
            return 0
        res = 0
        n = len(height)
        #1.lmax(list),rmax(list)
        lmax = [0]*n
        rmax = [0]*n
        for i in range(1,n-1):
            lmax[i] = max(lmax[i-1],height[i-1])
        for j in range(n-2,0,-1):
            rmax[j] = max(rmax[j+1],height[j+1])
        for i in range(1,n-1):
            water = min(lmax[i],rmax[i])-height[i]
            res+= water if water>0 else 0
        return res

        
python 复制代码
class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        #暴力,按列算。没想到这个:难受了------------每个位置的水量 = min(左最大高度,右最大高度)**该位置柱子高度 取大于0进行累加。
        #还是不知道怎么按行去计算,先看看自己的题解笔记
        #现在先对暴力做法做优化,其实就是优化求lmax和rmax的计算
            #1.lmax(list),rmax(list)
            #2.只在乎 左右最大高度中的最小者,双指针优化
        #单调栈解法也要看
        if len(height)<3:
            return 0
        res = 0
        n = len(height)
        #2.只在乎 左右最大高度中的最小者,双指针优化
        l,r = 0,n-1
        lmax,rmax = 0,0
        while l<r:
            #不要定义在里面啊,我去
            #lmax,rmax = 0,0
            if height[l]<=height[r]:
                lmax = max(lmax,height[l])
                l+=1
                res+=(lmax-height[l]) if lmax-height[l]>0 else 0
            else:
                rmax = max(rmax,height[r])
                r-=1
                res+=(rmax-height[r]) if rmax-height[r]>0 else 0 
        return res
        
        
python 复制代码
class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        #按行计算。这个解法很优美,但是很难想。细节很多
        #高度为0的行遍历,因为这行接不了水(同高度水位算起)
        #对于某个高度,去遍历每列,如果找到了左边界,就开始累加水量至临时变量,如果找到了右边界,就把临时变量累加存到RES
        n = len(height)
        if n<3:
            return 0
        res = 0
        maxheight = max(height)
        #没想到:先找到第一个大于等于该行高度的柱子作为积水的左边界,找到用bool标记
        for i in range(1,maxheight+1):
            tmp = 0
            flag = False
            for j in range(n):
                #取等号
                if height[j]>=i:
                    flag = True
                    res+=tmp
                    tmp = 0
                if flag and height[j]<i:
                    tmp+=1
        return res
python 复制代码
class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        #单调栈
        stk = []
        n = len(height)
        if n < 3 :
            return 0
        res = 0
        for i in range(n):
            #现在的问题是没有找到左边界就开始计算,应该取出top,作为桶底,当前是右侧最大高度,
            #top的左边是左侧高度(取最高吗,还是取前一个?)
                #是取前一个,最疑惑的事T字形,怎么计算:其实是高度乘以宽度。想一想模拟一下就懂了
            while stk and height[stk[-1]]<height[i]:
                bottom = stk.pop()
                #先检查栈内是否还存在柱子作为左边界
                #这里while里面写continue没有意义,因为里面没有指针增减的语句
                if not stk:
                    break
                h = min(height[stk[-1]],height[i])-height[bottom] 
                #宽度不要写错 细节很多
                res += h*(i-stk[-1]-1) if h*(i-stk[-1]-1)>0 else 0

            stk.append(i)
        return res
        
        

《3.无重复字符的最长子串》

python 复制代码
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        #不要老是想着用map,python是有set的
        occ = set()
        res = 0
        #确实是滑动窗口
        #没重复时候就一直扩张,当重复了(哈希set),就更新RES,并滑动窗口
        n = len(s)
        #python的for和c++、JAVA不一样,所以这种会跳指针而不是依次遍历的,用while比较好
        #枚举左边界
        left,right = 0,0
        while right<n:
            while s[right] in occ:
                #这时候重复字符不一定是s[left],所以不能在这统计res
                #res = max(res,right-left+1)
                occ.remove(s[left])
                left+=1
            occ.add(s[right])
            res = max(res,right-left+1)
            right+=1
            
        return res
相关推荐
saoys18 小时前
Opencv 学习笔记:形态学开 / 闭运算(解决噪点与孔洞问题)
笔记·opencv·学习
小猪佩奇TONY18 小时前
Linux 内核学习(16) --- linux x86-64 虚拟地址空间和区域
linux·运维·学习
深蓝海拓18 小时前
PySide6,QEventLoop.exec()的使用
笔记·python·qt·学习·pyqt
开开心心_Every18 小时前
离线黑白照片上色工具:操作简单效果逼真
java·服务器·前端·学习·edge·c#·powerpoint
爱喝水的鱼丶18 小时前
SAP-ABAP:SAP性能侦探:STAD事务码的深度解析与应用实战
开发语言·数据库·学习·sap·abap
专注于大数据技术栈18 小时前
java学习--Collection
java·开发语言·学习
浮游本尊18 小时前
React 18.x 学习计划 - 第十二天:企业级实践与进阶主题
学习·react.js·状态模式
代码游侠18 小时前
学习笔记——嵌入式与51单片机学习
单片机·嵌入式硬件·学习·51单片机
LateFrames18 小时前
极限:从基础数学,漫游到AI算力资源的分配
学习
代码游侠18 小时前
学习笔记——嵌入式系统与51单片机核心
笔记·单片机·嵌入式硬件·学习·51单片机