单调递增、递减栈用途

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]+" ");
}
}

}

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

猜你喜欢

转载自blog.csdn.net/ylf_2278880589/article/details/80048606