394.字符串解码
参考:
字节写了半天没写出来。。不知道怎么处理有嵌套的情况,就看了题解https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd
思路:
用一个栈同时将倍数和临时字符成对进栈。
1、当遇到左括号时进栈并将对应变量重置,以便重新记录
2、当遇到右括号时出栈并根据倍数和字符进行拼接
3、当遇到数字时记录倍数,要注意的是可能不一定只有个位,还有十位百位等
4、当遇到字符时,直接拼接形成临时字符,这是处理嵌套情形的关键
代码:
python
class Solution:
def decodeString(self, s: str) -> str:
stack, res, multi = [], "", 0
for c in s:
if c == '[':
stack.append([multi, res])
res, multi = "", 0
elif c == ']':
cur_multi, cur_res = stack.pop()
res = cur_res + cur_multi * res
elif '0' <= c <= '9':
multi = multi * 10 + int(c)
else:
res += c
return res
复杂度分析:
- 时间复杂度 O(N),一次遍历
s; - 空间复杂度 O(N),辅助栈在极端情况下需要线性空间,例如
2[2[2[a]]]。
739.每日温度
方法一:
思路:
一个数组记录相邻的温度差,再一个数组记录结果。相邻温度差大于0的,直接赋值为1;否则用一个变量来记录从这一位开始的温度差之和何时大于0,记录下下标差。
意料之中的超时了,而且思路还更复杂。。。什么脑袋,明明可以直接用两个循环超时反而用了更复杂的写法。。不知道之前是做什么题目使得我的脑袋里面出现了这个思路。。看下一个方法吧,我只是记录一下
代码:
python
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
n = len(temperatures)
prefix, res = [0] * n, [0] * n
for i in range(n - 1):
prefix[i] = temperatures[i + 1] - temperatures[i]
for i in range(n):
if prefix[i] > 0:
res[i] = 1
continue
sum_ = 0
for j in range(i, n):
sum_ += prefix[j]
if sum_ > 0:
res[i] = j - i + 1
break
return res
方法二:
参考:
思路:
保持一个从栈顶到栈底的单调递增栈,将栈顶对应元素和数组元素进行比较,若栈顶更大,则将数组下标入栈;若栈顶小的话说明遇到了相比这一天更高的温度,可以记录二者的下标差并弹出元素。
注意:记录下标比记录温度更方便修改
代码:
python
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
n = len(temperatures)
result = [0] * n
stack = [0]
for i in range(1, n):
if temperatures[i] <= temperatures[stack[-1]]:
stack.append(i)
else:
while len(stack) != 0 and temperatures[i] > temperatures[stack[-1]]:
result[stack[-1]] = i - stack[-1]
stack.pop()
stack.append(i)
return result
复杂度分析:
- 时间复杂度:O(N)
- 空间复杂度:O(N)
84.柱状图中最大的矩形
参考思路:
代码:
python
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
# 在数组头尾各增加一个0元素,以免单调增/减数组导致没有右/左边界的情况
heights.insert(0, 0) # 在0处插入0
heights.append(0)
stack = [0]
result = 0
for i in range(1, len(heights)):
if heights[i] > heights[stack[-1]]:
stack.append(i)
elif heights[i] == heights[stack[-1]]: # 如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度
stack.pop()
stack.append(i)
else:
while len(stack) != 0 and heights[i] < heights[stack[-1]]:
h = heights[stack[-1]]
stack.pop()
if stack:
w = i - stack[-1] - 1
result = max(result, h * w)
stack.append(i)
return result