[LeetCode] 496. Next Greater Element I 下一个较大的元素 I
You are given two arrays (without duplicates) nums1
and nums2
where nums1
’s elements are subset of nums2
. Find all the next greater numbers for nums1
's elements in the corresponding places of nums2
.
The Next Greater Number of a number x in nums1
is the first greater number to its right in nums2
. If it does not exist, output -1 for this number.
Example 1:
Input: nums1 = [4,1,2], nums2 = [1,3,4,2]. Output: [-1,3,-1] Explanation: For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1. For number 1 in the first array, the next greater number for it in the second array is 3. For number 2 in the first array, there is no next greater number for it in the second array, so output -1.
Example 2:
Input: nums1 = [2,4], nums2 = [1,2,3,4]. Output: [3,-1] Explanation: For number 2 in the first array, the next greater number for it in the second array is 3. For number 4 in the first array, there is no next greater number for it in the second array, so output -1.
Note:
- All elements in
nums1
andnums2
are unique. - The length of both
nums1
andnums2
would not exceed 1000.
给2个没有重复元素的数组nums1, nums2,nums1的元素是由nums2的子集组成,求nums1中每个数字在nums2右边第一个较大的数字,如果不存在则为-1。返回所找到的结果组成的数组。
Key observation:
Suppose we have a decreasing sequence followed by a greater number
For example [5, 4, 3, 2, 1, 6] then the greater number 6 is the next greater element for all previous numbers in the sequence
We use a stack to keep a decreasing sub-sequence, whenever we see a number x greater than stack.peek() we pop all elements less than x and for all the popped ones, their next greater element is x
For example [9, 8, 7, 3, 2, 1, 6]
The stack will first contain [9, 8, 7, 3, 2, 1] and then we see 6 which is greater than 1 so we pop 1 2 3 whose next greater element should be 6
解法:栈,递减栈。先求出nums2中所有元素的右边第一个较大数字的位置,并记录到map中。然后,因为nums1是子数组,循环nums1中的元素,记录在map中值并返回。求nums2中下一个较大元素时用递减栈,循环元素,当前元素大于栈顶元素时,就弹出栈顶元素,并记录栈顶元素下一个最大就是当前元素。然后继续比较栈顶元素,直到小于或等于栈顶元素。
G家followup: 如果data是stream data怎么改代码和设计输出。
Java:
public int[] nextGreaterElement(int[] findNums, int[] nums) { Map<Integer, Integer> map = new HashMap<>(); // map from x to next greater element of x Stack<Integer> stack = new Stack<>(); for (int num : nums) { while (!stack.isEmpty() && stack.peek() < num) map.put(stack.pop(), num); stack.push(num); } for (int i = 0; i < findNums.length; i++) findNums[i] = map.getOrDefault(findNums[i], -1); return findNums; }
Python:
class Solution(object): def nextGreaterElement(self, findNums, nums): """ :type findNums: List[int] :type nums: List[int] :rtype: List[int] """ d = {} st = [] ans = [] for x in nums: while len(st) and st[-1] < x: d[st.pop()] = x st.append(x) for x in findNums: ans.append(d.get(x, -1)) return ans
Python: wo
class Solution(object): def nextGreaterElement(self, findNums, nums): """ :type findNums: List[int] :type nums: List[int] :rtype: List[int] """ if not findNums or not nums: return [] m = {} for i in range(len(nums) - 1): for j in range(i + 1, len(nums)): if nums[j] > nums[i]: m[nums[i]] = nums[j] break if not m.get(nums[i], 0): m[nums[i]] = -1 m[nums[-1]] = -1 res = [] for num in findNums: res.append(m[num]) return res
C++:
class Solution { public: vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) { stack<int> s; unordered_map<int, int> m; for (int n : nums) { while (s.size() && s.top() < n) { m[s.top()] = n; s.pop(); } s.push(n); } vector<int> ans; for (int n : findNums) ans.push_back(m.count(n) ? m[n] : -1); return ans; } };
类似题目:
[LeetCode] 503. Next Greater Element II 下一个较大的元素 II
[LeetCode] 556. Next Greater Element III 下一个较大的元素 III
[LeetCode] 739. Daily Temperatures 每日温度
All LeetCode Questions List 题目汇总