LeetCode每日温度题运行报错:reference binding to misaligned address
解决LeetCode「每日温度」递归栈实现的运行时错误
错误原因分析
- 空栈直接访问
top():check函数里刚创建空栈就调用st.top(),这会触发未定义行为,是你看到内存对齐错误的直接原因。 dp向量未预分配空间:dp初始为空,直接用dp[i]赋值会导致越界访问,引发内存问题。- 局部栈无法复用状态:每次调用
check都新建空栈,完全无法记录之前遍历过的索引,违背单调栈解法的核心逻辑,递归也无法传递栈状态。 - 递归逻辑混乱:判断栈是否为空的顺序颠倒,递归调用时没有保留栈状态,根本无法实现“找下一个更高温度”的逻辑。
修正后的递归+单调栈实现
class Solution { public: vector<int> dailyTemperatures(vector<int>& temps) { int n = temps.size(); vector<int> dp(n, 0); stack<int> st; check(n - 1, temps, dp, st); return dp; } void check(int i, vector<int>& temps, vector<int>& dp, stack<int>& st) { if (i < 0) return; // 弹出栈中所有温度不大于当前值的索引 while (!st.empty() && temps[i] >= temps[st.top()]) { st.pop(); } // 计算当前位置的结果 dp[i] = st.empty() ? 0 : st.top() - i; // 当前索引入栈,供前面的元素对比 st.push(i); // 递归处理前一个元素 check(i - 1, temps, dp, st); } };
关键修正点
- 将栈作为引用参数传递,确保递归过程中栈的状态能被复用。
- 预先初始化
dp的大小为输入数组长度,避免越界访问。 - 调整逻辑顺序:先清理栈中无效元素,再计算结果,最后入栈当前索引,符合单调栈的核心逻辑。
- 递归从最后一个元素向前遍历,保证栈中始终保存后续未处理的元素索引。
内容的提问来源于stack exchange,提问作者Kartikay Azad
相关产品推荐
相关产品推荐

