@@ -30,17 +30,18 @@ public int[] nextGreaterElement(int[] nums1, int[] nums2) {
30
30
31
31
/*
32
32
单调递减栈:
33
- 1、从右到左遍历nums2数组,获取每个元素的下一个更大元素
34
- 1)栈不为空 且 当前元素大于等于栈顶元素,则栈顶元素出栈,循环处理,直到当前元素小于栈顶元素,那么栈顶元素就是当前元素的下一个更大元素
33
+ 1、栈存放的是元素,因为用不到索引。nums1才需要索引来映射到结果数组
34
+ 2、从右到左遍历nums2数组,获取每个元素的下一个更大元素
35
+ 1)栈不为空 且 当前元素大于栈顶元素,则栈顶元素出栈,循环处理,直到当前元素小于栈顶元素,那么栈顶元素就是当前元素的下一个更大元素
35
36
2)记录当前元素的下一个更大元素到map中,当前元素入栈
36
- 2 、遍历nums1数组,直接从map中获取当前元素的下一个更大元素,存入结果数组,返回结果
37
+ 3 、遍历nums1数组,直接从map中获取当前元素的下一个更大元素,存入结果数组,返回结果
37
38
*/
38
39
class Solution {
39
40
public int [] nextGreaterElement (int [] nums1 , int [] nums2 ) {
40
41
Map <Integer , Integer > map = new HashMap <>();
41
42
Deque <Integer > stack = new ArrayDeque <>();
42
43
for (int i = nums2 .length - 1 ; i >= 0 ; i --) {
43
- while (!stack .isEmpty () && nums2 [i ] >= stack .peek ()) {
44
+ while (!stack .isEmpty () && nums2 [i ] > stack .peek ()) {
44
45
stack .pop ();
45
46
}
46
47
map .put (nums2 [i ], stack .isEmpty () ? -1 : stack .peek ());
@@ -53,4 +54,32 @@ public int[] nextGreaterElement(int[] nums1, int[] nums2) {
53
54
}
54
55
return res ;
55
56
}
57
+ }
58
+
59
+
60
+ /*
61
+ 单调递减栈:
62
+ 1、栈存放的是元素,因为用不到索引。nums1才需要索引来映射到结果数组
63
+ 2、从左到右遍历nums2数组,获取每个元素的下一个更大元素
64
+ 1)栈不为空 且 当前元素大于栈顶元素,则栈顶元素出栈,该栈顶元素的下一个更大元素就是当前元素,记录到map中,循环处理,直到当前元素小于栈顶元素
65
+ 2)当前元素入栈
66
+ 3、遍历nums1数组,直接从map中获取当前元素的下一个更大元素,存入结果数组,返回结果
67
+ */
68
+ class Solution {
69
+ public int [] nextGreaterElement (int [] nums1 , int [] nums2 ) {
70
+ Map <Integer , Integer > map = new HashMap <>();
71
+ Deque <Integer > stack = new ArrayDeque <>();
72
+ for (int i = 0 ; i < nums2 .length ; i ++) {
73
+ while (!stack .isEmpty () && nums2 [i ] > stack .peek ()) {
74
+ map .put (stack .pop (), nums2 [i ]);
75
+ }
76
+ stack .push (nums2 [i ]);
77
+ }
78
+ int n = nums1 .length ;
79
+ int [] res = new int [n ];
80
+ for (int i = 0 ; i < n ; i ++) {
81
+ res [i ] = map .getOrDefault (nums1 [i ], -1 );
82
+ }
83
+ return res ;
84
+ }
56
85
}
0 commit comments