发布于2026-07-02 阅读(0)
扫一扫,手机访问
数组实现单调栈,解决“搜索最近更大元素”这一经典问题,可以说是又快又省内存。核心思路其实很简单——手动维护一个严格递减(或递增)的数组栈,通过一次遍历就能完成所有查询,时间复杂度稳稳地落在O(n),空间复杂度也是O(n)。
Ja va的Stack类基于Vector,自带线程同步,慢;Python的list虽然能当栈用,但频繁的append/pop背后总免不了动态扩容和边界检查。而手动用数组模拟栈,好处很明显:
top控制栈顶,所有读写操作就是一次O(1)的数组索引访问目标很明确:对每个位置i,找出它右边第一个比它大的元素。做法是维护一个单调递减栈——栈里存的是索引,对应值从底到顶递减。流程是这样的:
inums[i] > nums[stack[top]],说明i就是栈顶索引的“下一个更大位置”,弹出栈顶并记录结果i压入栈咱们直接看一段Ja va示例代码,完全不依赖任何集合类,纯数组加一个top指针就行:
int[] stack = new int[nums.length]; // 预分配空间
int top = -1; // 栈顶索引,-1表示空栈
int[] res = new int[nums.length];
Arrays.fill(res, -1); // 默认没有更大元素
for (int i = 0; i < nums.length; i++) {
while (top >= 0 && nums[i] > nums[stack[top]]) {
int idx = stack[top--];
res[idx] = nums[i]; // 或者存下标,根据题意定
}
stack[++top] = i;
}
这里有个小细节需要注意:top初始化为-1,++top是先自增再存,top--是先取再自减,完全符合栈的后进先出行为。
while (top >= 0 && ...)换成while (top != -1 && ...),部分JVM对后者优化更友好nums[stack[top]]提前读进局部变量,减少两次数组寻址的开销res数组的初始化填充,等全部遍历完再统一处理残留结果short[]来存索引,内存带宽能省下一半
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8