JavaScript栈实现下一个更大元素:代码不符合预期求助
下一个更大元素函数问题分析与修正指引
核心问题分析
你的代码思路选用栈来解决问题是正确的,但存在几个关键逻辑错误导致结果不符合预期:
- 栈存储内容错误:直接存储元素值,无法对应
result数组的正确索引位置,导致结果顺序混乱。比如测试用例1中的23,它之后没有更大元素,应该对应result[1]为-1,但你的代码未给它分配正确位置,最后错误地将其作为剩余元素把-1追加到结果末尾。 - 遍历逻辑错误:仅遍历到倒数第二个元素,且每次直接将当前元素入栈后用下一个元素比较,无法覆盖所有元素的匹配逻辑。比如第一个元素56,之后没有更大元素,应对应
result[0]为-1,但你的代码最后通过unshift添加,导致其他元素位置错位。 - 剩余栈元素处理逻辑错误:通过判断是否为数组第一个元素来决定
unshift或push-1,完全不符合需求。剩余栈中的元素都是未找到下一个更大元素的,应根据它们的原始索引在result对应位置填充-1。
修正方向
- 栈改为存储元素索引:精准定位
result数组需要填充的位置,避免结果顺序混乱。 - 从数组末尾开始遍历:这是单调栈解决下一个更大元素的标准方案,维护一个单调递减栈(栈顶为当前元素之后的第一个更大元素):
- 遍历第
i个元素时,先弹出栈中所有比当前元素小的元素(这些元素不可能成为前面元素的更大值); - 栈不为空时,栈顶对应的元素就是当前元素的下一个更大值,否则填
-1; - 将当前元素的索引压入栈,作为前面元素的候选更大值。
- 遍历第
- 初始化固定长度的result数组:提前创建与输入数组长度一致的数组,按索引填充结果,避免顺序错位。
修正后的示例代码
function greaterL(arr) { const stack = []; const result = new Array(arr.length).fill(-1); // 从后往前遍历数组 for (let i = arr.length - 1; i >= 0; i--) { // 弹出栈中所有小于等于当前元素的索引 while (stack.length > 0 && arr[stack[stack.length - 1]] <= arr[i]) { stack.pop(); } // 栈不为空则取栈顶元素对应的值作为当前元素的下一个更大元素 if (stack.length > 0) { result[i] = arr[stack[stack.length - 1]]; } // 当前元素索引入栈 stack.push(i); } return result; }
测试验证:
console.log(greaterL([56, 23, 1, 5, 18, 17])) // 输出:[-1, -1, 5, 18, -1, -1] console.log(greaterL([70, 60, 1, 4, 8, 12, 50, 23])) // 输出:[-1,-1, 4, 8, 12, 50, -1, -1]
补充说明
如果坚持从前往后遍历,核心逻辑仍需保持栈存索引、结果数组按索引填充,避免随意向result中push值。但从后往前遍历的实现更直观且不易出错。
内容的提问来源于stack exchange,提问作者OWELEY
相关产品推荐
相关产品推荐

