496. 下一个更大元素 I 单调栈+哈希表

496. 下一个更大元素 I

难度:简单
题目描述
496. 下一个更大元素 I 单调栈+哈希表_第1张图片
解题思路
写了今天的每日一题,特意去找了找其它单调栈的题目来做,这道题就思路很清楚啦。维持一个递减的单调栈,如果下一个数字大于栈顶元素,那栈顶元素就找到了对应的右边第一个比它大的数。因为数组中的数字没有重复元素,所以用哈希表来存需要找的元素

public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        if(nums1.length == 0)
            return nums1;
        HashMap<Integer, Integer> hashMap = new HashMap<>();
			 Stack<Integer> stack = new Stack<>();
			 int[] re = new int[nums1.length];
			 Arrays.fill(re, -1);
			 for (int i = 0;i < nums1.length;i++) {
				hashMap.put(nums1[i], i);
			}
			 stack.push(nums2[0]);
			 for (int i = 1; i < nums2.length; i++) {
				while(!stack.isEmpty() && stack.peek() < nums2[i]) {
					int temp = stack.peek();
					if(hashMap.containsKey(temp)) { //如果这个元素是要求的
						int index = hashMap.get(temp);
						re[index] = nums2[i];
						hashMap.remove(temp);  //只要找到右边第一个位置
					}
					stack.pop();
				}
				stack.push(nums2[i]);
			}
			 return re;
    }

496. 下一个更大元素 I 单调栈+哈希表_第2张图片

还有另外一种写法,先把所有的结果存在哈希表里,然后遍历一遍nums1数组依次取值,单调栈的思路都是一样的。

public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        if(nums1.length == 0)
            return nums1;
        HashMap<Integer, Integer> hashMap = new HashMap<>();
			 Stack<Integer> stack = new Stack<>();
			 int[] re = new int[nums1.length];
			 stack.push(nums2[0]);
			 for (int i = 1; i < nums2.length; i++) {
				while(!stack.isEmpty() && stack.peek() < nums2[i]) {
					int temp = stack.pop();
					hashMap.put(temp, nums2[i]);
				}
				stack.push(nums2[i]);
			}
			 for (int i = 0;i < nums1.length;i++) {
				 if(hashMap.containsKey(nums1[i])) { //如果这个元素是要求的
						re[i] = hashMap.get(nums1[i]);
					}else {
						re[i] = -1;
					}
				}
			 return re;
    }

496. 下一个更大元素 I 单调栈+哈希表_第3张图片

你可能感兴趣的:(力扣刷题笔记)