单调递增、递减栈用途

import java.util.ArrayList;

public class Main {
public static void main(String[] args) {
int[] nums= {1,5,2,7,9,8,4,10};
getLeftFirstLT(nums);//求解数组中元素右边第一个比它小的元素的下标,从前往后,构造单调递增栈
getLeftFirstGT(nums);//求解数组中元素右边第一个比它大的元素的下标,从前往后,构造单调递减栈
getRightFirstLT(nums);//求解数组中元素左边第一个比它小的元素的下标,从后往前,构造单调递减栈
getRightFirstGT(nums);//求解数组中元素左边第一个比它小的元素的下标,从后往前,构造单调递增栈
}
public static void getRightFirstGT(int[] nums) {
int[] L=new int[nums.length];
ArrayList<Integer> arr=new ArrayList<Integer>();
int top=-1;
int index=nums.length-1;
while(index>=0) {
if(top==-1) {
L[index]=-1;
arr.add(index);
top++;
}else {
while(top>-1 && nums[index]>nums[arr.get(top)]) {
arr.remove(top);
top--;
}
if(top==-1) {
L[index]=-1;
}else {
L[index]=arr.get(top);
}
arr.add(index);
top++;
}
index--;
}
for(int i=0;i<L.length;i++) {
System.out.print(L[i]+" ");
}
}
public static void getRightFirstLT(int[] nums) {
int[] L=new int[nums.length];
ArrayList<Integer> arr=new ArrayList<Integer>();
int top=-1;
int index=nums.length-1;
while(index>=0) {
if(top==-1) {
L[index]=-1;
arr.add(index);
top++;
}else {
while(top>-1 && nums[index]<nums[arr.get(top)]) {
arr.remove(top);
top--;
}
if(top==-1) {
L[index]=-1;
}else {
L[index]=arr.get(top);
}
arr.add(index);
top++;
}
index--;
}
for(int i=0;i<L.length;i++) {
System.out.print(L[i]+" ");
}
}
public static void getLeftFirstGT(int[] nums) {
int[] L=new int[nums.length];
ArrayList<Integer> arr=new ArrayList<Integer>();
int top=-1;
//寻找一个元素左边第一个比它大的元素,栈中存放的是数组下标
int index=0;
while(index<nums.length) {
if(top==-1) {
L[index]=-1;
arr.add(index);
top++;
}else {
while(top>-1 && nums[index]>nums[arr.get(top)]) {
arr.remove(top);
top--;
}
if(top==-1) {
L[index]=-1;
}else {
L[index]=arr.get(top);
}
arr.add(index);
top++;
}
index++;
}
for(int i=0;i<L.length;i++) {
System.out.print(L[i]+" ");
}
}
public static void getLeftFirstLT(int[] nums) {
int[] L=new int[nums.length];
ArrayList<Integer> arr=new ArrayList<Integer>();
int top=-1;
//寻找一个元素左边第一个比它小的元素,栈中存放的是数组下标
int index=0;
while(index<nums.length) {
if(top==-1) {
L[index]=-1;
arr.add(index);
top++;
}else {
while(top>-1 && nums[index]<nums[arr.get(top)]) {
arr.remove(top);
top--;//如果当前元素小于栈顶元素,退栈.
}
if(top==-1) {
L[index]=-1;
}else {
L[index]=arr.get(top);
}
arr.add(index);
top++;
}
index++;
}
for(int i=0;i<L.length;i++) {
System.out.print(L[i]+" ");
}
}

}

左边/右边求解只有加粗的部分不同。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值