题解:
//单调栈解法:每次新元素入栈时,栈内的元素都保持单调递增或递减
public static int[] nextGreaterEle(int[] nums) {
int[] res=new int[nums.length];//存放结果的数组
Stack<Integer> s=new Stack<>();
for (int i = nums.length-1; i >=0 ; i--) {
while (!s.empty()&&s.peek()<=nums[i]) {
//
s.pop();
}
res[i]=s.empty()?-1:s.peek();
s.push(nums[i]);
}
System.out.println(s);
return res;
}
public static int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] tem=new int[nums2.length];
int[] res=new int[nums1.length];
Stack<Integer> s=new Stack<>();
HashMap<Integer,Integer> map=new HashMap<>();
for (int i = nums2.length-1; i >=0 ; i--) {
while (!s.empty()&&s.peek()<=nums2[i]) {
s.pop();
}
tem[i]=s.empty()?-1:s.peek();
map.put(nums2[i],tem[i]);
s.push(nums2[i]);
}
for (int i = 0; i < nums1.length; i++) {
res[i]=map.get(nums1[i]);
}
return res;
}
public static int[] nextGreaterElements(int[] nums) {
int len=nums.length;
int[] r=new int[nums.length];
Stack<Integer> s=new Stack<>();
//处理环形数组
//循环数组,关于循环数组的一个技巧就是*2取余了
for (int i = len*2-1; i >=0 ; i--) {
while (!s.empty()&&s.peek()<=nums[i%len]) {
s.pop();
}
r[i%len]=s.empty()?-1:s.peek();
s.push(nums[i%len]);
}
return r;
}