57
57
58
58
** 方法一:单调栈**
59
59
60
- 先对将 nums2 中的每一个元素,求出其下一个更大的元素。随后对于将这些答案放入哈希映射(HashMap)中,再遍历数组 nums1,并直接找出答案。对于 nums2,可以使用单调栈来解决这个问题。
61
-
62
60
单调栈常见模型:找出每个数左/右边** 离它最近的** 且** 比它大/小的数** 。模板:
63
61
64
62
``` python
@@ -69,6 +67,10 @@ for i in range(n):
69
67
stk.append(i)
70
68
```
71
69
70
+ 对于本题,先对将 $nums2$ 中的每一个元素,求出其下一个更大的元素。随后对于将这些答案放入哈希表 $m$ 中,再遍历数组 $nums1$,并直接找出答案。对于 $nums2$,可以使用单调栈来解决这个问题。
71
+
72
+ 时间复杂度 $O(M+N)$,其中 $M$ 表示 $nums1$ 的长度,$N$ 表示 $nums2$ 的长度。
73
+
72
74
<!-- tabs:start -->
73
75
74
76
### ** Python3**
@@ -87,6 +89,20 @@ class Solution:
87
89
return [m.get(v, - 1 ) for v in nums1]
88
90
```
89
91
92
+ ``` python
93
+ class Solution :
94
+ def nextGreaterElement (self , nums1 : List[int ], nums2 : List[int ]) -> List[int ]:
95
+ m = {}
96
+ stk = []
97
+ for v in nums2[::- 1 ]:
98
+ while stk and stk[- 1 ] <= v:
99
+ stk.pop()
100
+ if stk:
101
+ m[v] = stk[- 1 ]
102
+ stk.append(v)
103
+ return [m.get(x, - 1 ) for x in nums1]
104
+ ```
105
+
90
106
### ** Java**
91
107
92
108
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -112,6 +128,30 @@ class Solution {
112
128
}
113
129
```
114
130
131
+ ``` java
132
+ class Solution {
133
+ public int [] nextGreaterElement (int [] nums1 , int [] nums2 ) {
134
+ Deque<Integer > stk = new ArrayDeque<> ();
135
+ Map<Integer , Integer > m = new HashMap<> ();
136
+ for (int i = nums2. length - 1 ; i >= 0 ; -- i) {
137
+ while (! stk. isEmpty() && stk. peek() <= nums2[i]) {
138
+ stk. pop();
139
+ }
140
+ if (! stk. isEmpty()) {
141
+ m. put(nums2[i], stk. peek());
142
+ }
143
+ stk. push(nums2[i]);
144
+ }
145
+ int n = nums1. length;
146
+ int [] ans = new int [n];
147
+ for (int i = 0 ; i < n; ++ i) {
148
+ ans[i] = m. getOrDefault(nums1[i], - 1 );
149
+ }
150
+ return ans;
151
+ }
152
+ }
153
+ ```
154
+
115
155
### ** JavaScript**
116
156
117
157
``` js
@@ -133,6 +173,28 @@ var nextGreaterElement = function (nums1, nums2) {
133
173
};
134
174
```
135
175
176
+ ``` js
177
+ /**
178
+ * @param {number[]} nums1
179
+ * @param {number[]} nums2
180
+ * @return {number[]}
181
+ */
182
+ var nextGreaterElement = function (nums1 , nums2 ) {
183
+ let stk = [];
184
+ let m = {};
185
+ for (let v of nums2 .reverse ()) {
186
+ while (stk && stk[stk .length - 1 ] <= v) {
187
+ stk .pop ();
188
+ }
189
+ if (stk) {
190
+ m[v] = stk[stk .length - 1 ];
191
+ }
192
+ stk .push (v);
193
+ }
194
+ return nums1 .map (e => m[e] || - 1 );
195
+ };
196
+ ```
197
+
136
198
### ** C++**
137
199
138
200
``` cpp
@@ -157,6 +219,25 @@ public:
157
219
};
158
220
```
159
221
222
+ ```cpp
223
+ class Solution {
224
+ public:
225
+ vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
226
+ stack<int> stk;
227
+ unordered_map<int, int> m;
228
+ for (int i = nums2.size() - 1; ~i; --i)
229
+ {
230
+ while (!stk.empty() && stk.top() <= nums2[i]) stk.pop();
231
+ if (!stk.empty()) m[nums2[i]] = stk.top();
232
+ stk.push(nums2[i]);
233
+ }
234
+ vector<int> ans;
235
+ for (int& v : nums1) ans.push_back(m.count(v) ? m[v] : -1);
236
+ return ans;
237
+ }
238
+ };
239
+ ```
240
+
160
241
### ** Go**
161
242
162
243
``` go
@@ -182,6 +263,31 @@ func nextGreaterElement(nums1 []int, nums2 []int) []int {
182
263
}
183
264
```
184
265
266
+ ``` go
267
+ func nextGreaterElement (nums1 []int , nums2 []int ) []int {
268
+ stk := []int {}
269
+ m := map [int ]int {}
270
+ for i := len (nums2) - 1 ; i >= 0 ; i-- {
271
+ for len (stk) > 0 && stk[len (stk)-1 ] <= nums2[i] {
272
+ stk = stk[:len (stk)-1 ]
273
+ }
274
+ if len (stk) > 0 {
275
+ m[nums2[i]] = stk[len (stk)-1 ]
276
+ }
277
+ stk = append (stk, nums2[i])
278
+ }
279
+ var ans []int
280
+ for _ , v := range nums1 {
281
+ val , ok := m[v]
282
+ if !ok {
283
+ val = -1
284
+ }
285
+ ans = append (ans, val)
286
+ }
287
+ return ans
288
+ }
289
+ ```
290
+
185
291
### ** TypeScript**
186
292
187
293
``` ts
0 commit comments