2024.03.03_学习日记
天气:晴
学习地点:学校
学习时长:4h
学习内容
- lc224


栈是用来存放左括号前面的东西以及左括号前的符号,还要准备一个sign用来看当前num的符号,如果遇到数字,num就更新,遇到+-号,ans更新,num重置到下一个位置的数字,更新为0,sign更新为当前遍历到的符号。如果遇到左括号,把此时的res以及sign添加到栈,然后ans更新为0,sign更新为+,遇到右括号的时候,括号里面的计算完了,就要把当前括号里的和左括号前面的ans计算一下,所以ans里面最后的num*sign+res更新一下,得到ans值,然后乘以stack的pop符号,再加上stack的pop值,num要更新为0,因为当前值计算完了。最后还要继续往后遍历,把最后的num值要加上。 - lc11

用一个res记录最大值,用双指针解,如果最左边小于最右边,那res=小边*宽度,然后小边往中间移动,为什么这样能更新最大值,因为如果小边往里移动,就算大边的外面有更大的值能更新更大的宽度,但是既然大边已经往里移动了,那大边的外面肯定是有比小边更大的值,这个更大的值往中间移动了就证明这个更大的值有一个更大宽度的res,所以可以这样更新res。 - lc20

左括号入栈,用哈希表对应左右括号,然后看stack弹出的值能否在哈希表内匹配,如果不能匹配就false,最后返回stack长度是不是等于1,那如果右括号多,stack弹出报错怎么办呢?初始化的时候往stack里放入一个‘?’,哈希表也放一个‘?’:‘?’,如果右括号多的话,stack弹出的元素会和右括号不匹配,这样就提前false了。 - lc301

这个题用bfs做很好理解,首先认识filter函数,filter(函数名,筛选对象)就能把对象中符合函数名的子对象筛选出来,然后当删除最小数量个括号以后的答案,如果要生成就可以用bfs来做,第一次先把整个s放进filter,然后删除掉s的每个括号,然后放进nextlevel里再放进filter里,如果有满足条件的,那就返回即可,如果没有就继续删括号,重复这个过程,filter的函数就是判断括号是否有效的函数,就是上面第三题的简化版,用cnt就能判断。还有一个细节就是加入nextlevel的部分应该是item【:i】+item【i+1:】,因为右括号切片是取不到的,还有一个细节是用set可以过滤重复的答案,set只能add不能append。