- 402.【移掉 K 位数字后】最小的数(Medium)/ 316.【去除重复字母后】字典序最小字符串(Medium)/ 321.【从 2 个数组中选出 K 个数】拼接最大数(Hard)
- 84. 柱状图中最大的矩形(Hard)
- 85. 最大矩形(Hard)
739. 每日温度
class Solution:
### 0127 单调栈(496 ms,18.9 MB)
def dailyTemperatures(self, T: List[int]) -> List[int]:
n = len(T)
ans = [0] * n
stack = [] # 单调递增栈(栈顶stack[-1]对应的值最小),存放尚未找到更高温度的下标(存放下标)
for i in range(n):
temp = T[i]
# 若单调栈非空 and 当前温度比单调栈中的最近温度高
while stack and temp > T[stack[-1]]:
# 暂未出现更高天气的最低的温度出栈,并更新对应的下标的天数(此时找到了最近的比它高的温度)
prev_idx = stack.pop()
ans[prev_idx] = i - prev_idx
# 每个元素的下标入栈
stack.append(i)
return ans
853. (合并后的)车队数量
class Solution:
def carFleet(self, target: int, position: List[int], speed: List[int]) -> int:
# 根据到终点的距离排序,离终点越近的车排最前面(相当于逆序)
pair = [(p, s) for p, s in zip(position, speed)]
pair.sort(reverse=True)
stack = [] # 单调递增栈(栈顶stack[-1]对应的值最小),存放需要的瓶颈时间
for p, s in pair:
# 计算每辆车到终点所需要的时间(从离终点最近的一辆车开始算)
time = (target - p) / s
stack.append(time)
# 若离终点更远的车,需要的时间比前面一辆车更短,那么就受限于前车(组成车队)
if len(stack) >= 2 and stack[-1] <= stack[-2]:
stack.pop()
return len(stack)
1673. 最具竞争力的子序列
class Solution:
def mostCompetitive(self, nums: List[int], k: int) -> List[int]:
stack = []
n = len(nums)
delete_nums = n - k # 可以删除 (n - k) 个数
for i in range(n):
while stack and delete_nums and stack[-1] > nums[i]:
stack.pop()
delete_nums -= 1
stack.append(nums[i])
return stack[:k]