这道题要用最小堆(优先队列)加BFS的思路。他从边界开始,将最低的柱子作为“水桶”的短板,向内推进。
思路清晰后,他再次开始编码。这次花了些时间,约八分钟。
import heapq
def trapRainWater(heightMap):
if not heightMap:
return 0
m, n = len(heightMap), len(heightMap[0])
if m < 3 or n < 3:
return 0
visited = [[False] * n for _ in range(m)]
heap = []
# 将边界加入堆
for i in range(m):
heapq.heappush(heap, (heightMap[i][0], i, 0))
heapq.heappush(heap, (heightMap[i][n-1], i, n-1))
visited[i][0] = visited[i][n-1] = True
for j in range(1, n-1):
heapq.heappush(heap, (heightMap[0][j], 0, j))
heapq.heappush(heap, (heightMap[m-1][j], m-1, j))
visited[0][j] = visited[m-1][j] = True
directions = [(0,1),(0,-1),(1,0),(-1,0)]
water = 0
while heap:
height, x, y = heapq.heappop(heap)
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < m and 0 <= ny < n and not visited[nx][ny]:
visited[nx][ny] = True
# 如果相邻格子比当前边界矮,可以接水
water += max(0, height - heightMap[nx][ny])
# 新边界的高度是 max(当前边界高度, 相邻格子高度)
heapq.heappush(heap, (max(height, heightMap[nx][ny]), nx, ny))
return water
运行,再次AC。
王磊看着结果,沉默了几秒。然后他抬起头,笑容更明显了些:“两道Hard题,全部一次AC,而且时间控制得很好。林先生,你的算法功底比很多科班出身的候选人还要扎实”。
“谢谢”。林晨松了口气,但不敢放松——他知道,算法只是门槛,真正的重点在后面。
果然,王磊将iPad放到一边,身体前倾:“那我们聊聊项目吧。你简历上写的这个‘智能量化投资系统’,我挺感兴趣的。一个做了十年跨境电商的人,怎么想到做这个”?
林晨知道,展示价值的时刻到了。
他打开自己带来的笔记本电脑,调出系统的架构图:“其实逻辑是相通的。跨境电商要做库存预测、价格优化、用户行为分析,本质也是数据驱动决策。我失业后开始学AI,就想能不能把机器学习用在投资上”。
他切换到系统界面——这是他自己开发的Web端,简洁的深色主题,左侧是菜单栏,中间是K线图和策略信号。
“系统分为几个模块”。林晨开始讲解,“数据层,我从多个数据源获取A股、基金、期货、外汇的实时和历史数据,用PySpark做清洗和预处理。特征工程部分,我提取了上百个技术指标,包括均线、MACD、RSI、布林带,还有一些自己设计的因子”。
王磊认真听着,偶尔点头。
“模型层,我用了集成学习。基础模型包括LSTM、GRU这些时序模型,还有XGBoost和LightGBM。但不是简单堆叠,我设计了一个元学习器,动态评估每个子模型在不同市场状态下的表现,分配权重”。
“怎么评估市场状态”?王磊问。
“我用无监督学习做了聚类”。林晨切换到另一张图,“根据波动率、成交量、行业轮动速度等维度,把市场分为震荡市、单边上涨、单边下跌、高波动四种状态。每种状态下,不同策略的
>>>点击查看《AI时代:码农的涅盘重生》最新章节