[程序员代码面试指南]栈和队列-单调栈结构(单调栈)
问题描述
给定一个数组,找到每一个位置左边和右边离它最近的且值比它小的位置,返回一个二维数组表示每个位置对应的两个位置。
解题思路
- 使用单调栈,保证栈内元素从栈顶到栈底严格单调递减。
- 每个元素入出栈一次,时间复杂度O(n)
具体的,如果x位置被弹出,在栈中位于ta下面的位置的元素就是满足题意的左边元素,当前元素就是满足题意的右边元素。
若该位置下面无元素,则左边为-1.
遍历阶段结束后,清算栈中剩下位置,所有此阶段弹出的右边为-1.、
todo
处理含重复元素数组的改进方法待做。
代码
import java.util.Stack;
public class Main {
public static void main(String args[]) {
int[] arr= {3,4,1,5,6,2,7};
//int[] arr= {3,1,3,4,3,5,3,2,2};
int[][] nearPos=nearSmallerNumPos(arr);
for(int i=0;i<nearPos.length;++i) {
for(int j=0;j<nearPos[0].length;++j) {
System.out.print(nearPos[i][j]);
}
System.out.print("\n");
}
}
public static int[][] nearSmallerNumPos(int arr[]){
int[][] nearPos=new int[arr.length][2];
Stack<Integer> stack=new Stack<>();
for(int i=0;i<arr.length;++i) {
while(!stack.isEmpty()&&arr[stack.peek()]>arr[i]) {//
int pos=stack.pop();
nearPos[pos][0]=stack.isEmpty()?-1:stack.peek();
nearPos[pos][1]=i;//
}
stack.push(i);//
}
while(!stack.isEmpty()) {
int pos=stack.pop();//
nearPos[pos][0]=stack.isEmpty()?-1:stack.peek();
nearPos[pos][1]=-1;
}
return nearPos;
}
}
posted on 2019-05-14 23:05 coding_gaga 阅读(138) 评论(0) 编辑 收藏 举报
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· Ai满嘴顺口溜,想考研?浪费我几个小时