496.下一个更大元素
https://leetcode.cn/problems/next-greater-element-i/submissions/
定义一个和nums1一样大小的数组result来存放结果
result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1
在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过
没有重复元素,我们就可以用map来做映射
根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过
接下来就要分析如下三种情况,一定要分析清楚。
情况一:
当前遍历的元素T[i]小于栈顶元素T[temp.peek()]的情况
此时满足递增栈(栈头到栈底的顺序),所以直接入栈。
情况二:
当前遍历的元素T[i]等于栈顶元素T[temp.peek()]的情况
如果相等的话,依然直接入栈,因为我们要求的是右边第一个比自己大的元素,而不是大于等于!
情况三:
当前遍历的元素T[i]大于栈顶元素T[temp.peek()]的情况
此时如果入栈就不满足递增栈了,这也是找到右边第一个比自己大的元素的时候。
判断栈顶元素是否在nums1里出现过,(注意栈里的元素是nums2的元素),如果出现过,开始记录结果。
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Stack<Integer> temp = new Stack<>();//单调栈,递增
int[] res = new int[nums1.length];//记录结果集
Arrays.fill(res,-1);//初始化-1
HashMap<Integer,Integer> hashmap = new HashMap<>();//利用没有重复的特性
for(int i=0;i<nums1.length;i++){
hashmap.put(nums1[i],i);
}
temp.add(0);
for(int i=1;i<nums2.length;i++){
if(nums2[i] <= nums2[temp.peek()]){
temp.add(i);
}else{
while(!temp.isEmpty() && nums2[temp.peek()] < nums2[i]){
if(hashmap.containsKey(nums2[temp.peek()])){
Integer index = hashmap.get(nums2[temp.peek()]);
res[index] = nums2[i];
}
temp.pop();
}
temp.add(i);
}
}
return res;
}
}
503.下一个更大元素2
https://leetcode.cn/problems/next-greater-element-ii/submissions/
class Solution {
public int[] nextGreaterElements(int[] nums) {
int size = nums.length;
Stack<Integer> temp = new Stack<>();
int[] res = new int[size];
if(nums == null || nums.length <=1){
return new int[]{-1};
}
Arrays.fill(res,-1);
for(int i=0;i<2*size;i++){
while(!temp.isEmpty() && nums[i%size] > nums[temp.peek()]){
res[temp.peek()] = nums[i% size];
temp.pop();
}
temp.push(i%size);
}
return res;
}
}