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