[LeetCode] 496. Next Greater Element I
来源:互联网 发布:淘宝外贸原单江苏南通 编辑:程序博客网 时间:2024/06/05 15:32
题目链接: https://leetcode.com/problems/next-greater-element-i/description/
Description
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.
解题思路
题意为对于数组 nums2
的子集 nums1
中的每一个元素 x
,在数组 nums2
中寻找第一个位于元素 x
右侧且大于 x
的元素值。可以扩展为针对整个 nums2
数组,即对于数组 nums2
的每一个元素 x
,寻找第一个位于 x
右侧且大于 x
的元素值。
可以使用一个栈来保存元素 x
右侧的元素值,由于要找第一个满足要求的值,所以可以对数组 nums2
从后往前遍历,这样入栈也可以保证越靠近栈顶越接近 x
。另外,使用 map
来记录每一个元素对应的第一个满足要求的元素值,不存在则对应的值为 -1
。
基本流程为,对数组 nums2
从后往前遍历,先判断栈是否为空,若为空,则说明元素 x
右侧没有其他元素,令 map[x] = -1
;若不为空,则判断栈顶元素 t
是否小于 x
,若小于则出栈以获得离 x
更远的元素,继续判断更远的元素是否小于 x
,直到栈为空则表明无满足要求元素值,或者出现 t > x
,则 t
即为第一个大于 x
且离 x
最近的元素值,记录到 map
中。将 x
入栈,供前面的元素来判断。
最后,对 nums1
中的每个元素,在 map
中找对应的值即可。
注: 在每一步中,可以确保栈中的元素从栈顶到栈底严格单调递增。
Code
class Solution {public: vector<int> nextGreaterElement(vector<int> &findNums, vector<int> &nums) { int m = findNums.size(), n = nums.size(); unordered_map<int, int> umap; stack<int> s; vector<int> res(m, -1); for (int i = n - 1; i >= 0; --i) { while (!s.empty() && s.top() < nums[i]) s.pop(); if (s.empty()) { umap[nums[i]] = -1; } else { umap[nums[i]] = s.top(); } s.push(nums[i]); } for (int i = 0; i < m; ++i) res[i] = umap[findNums[i]]; return res; }};
- 【Leetcode】496. Next Greater Element I
- leetcode -- 496. Next Greater Element I 【栈】
- 【LeetCode】496. Next Greater Element I
- LeetCode 496. Next Greater Element I
- LeetCode 496. Next Greater Element I
- leetcode 496. Next Greater Element I
- LeetCode-496. Next Greater Element I
- [LeetCode]496. Next Greater Element I
- LeetCode 496. Next Greater Element I
- LeetCode 496. Next Greater Element I
- LeetCode | 496. Next Greater Element I
- 【LeetCode】496. Next Greater Element I
- 【LeetCode】496. Next Greater Element I
- Leetcode 496. Next Greater Element I
- LeetCode:496. Next Greater Element I
- LeetCode OJ 496. Next Greater Element I
- 【C++】【LeetCode】496. Next Greater Element I
- LeetCode 496. Next Greater Element I
- 高程笔记-ECMAScript中的所有函数的参数都是按值传递的
- CSS垂直水平局中
- 科技巨头纷纷发力AI,智能硬件已来临,变现还会远吗?
- bzoj2453 维护队列 & bzoj2120 数颜色 (带修改莫队)
- CF 792E Coloured Ballons 平方分割+枚举
- [LeetCode] 496. Next Greater Element I
- Spark性能优化指南-高级篇
- eclipse+cygwin设置c++11编译环境
- leetCode-Plus One
- Matlab如何从dat或者txt文件读入数据
- 利用excel和spss删除频数小的数据
- Saving James Bond
- [数位DP 多重背包计数] BZOJ5003. 与链
- Linux的进程环境