学习日记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
相关推荐
AA陈超39 分钟前
LyraRPG:001.创建RPGCore插件
c++·笔记·学习·ue5·虚幻引擎·lyra
组合缺一1 小时前
Solon AI 开发学习11 - chat - 工具调用与定制(Tool Call)
人工智能·学习·ai·chatgpt·llm·solon·toolcall
AA陈超1 小时前
Lyra学习6:GameFeatureAction_AddComponents分析
c++·笔记·学习·ue5
Rock_yzh2 小时前
LeetCode算法刷题——56. 合并区间
数据结构·c++·学习·算法·leetcode·职场和发展·动态规划
HalvmånEver2 小时前
Linux:进程创建(进程控制一)
linux·运维·服务器·学习·进程·fork
前端老曹2 小时前
Jspreadsheet CE V5 使用手册(保姆版) 二
开发语言·前端·vue.js·学习
952362 小时前
二叉平衡树
java·数据结构·学习·算法
YJlio2 小时前
Autologon 学习笔记(9.7):安全自动登录的正确打开方式
笔记·学习·安全
四谎真好看3 小时前
Java 黑马程序员学习笔记(进阶篇30)
java·笔记·学习·学习笔记