Skip to content

Commit 61e87f4

Browse files
committed
503.下一个更大元素II,单调递减栈
1 parent 300039d commit 61e87f4

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
491. 递增子序列
8282
494. 目标和
8383
496. 下一个更大元素 I
84+
503. 下一个更大元素 II
8485
509. 斐波那契数
8586
516. 最长回文子序列
8687
518. 零钱兑换 II

leetcode_Java/Solution0496.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,18 @@ public int[] nextGreaterElement(int[] nums1, int[] nums2) {
3030

3131
/*
3232
单调递减栈:
33-
1、从右到左遍历nums2数组,获取每个元素的下一个更大元素
34-
1)栈不为空 且 当前元素大于等于栈顶元素,则栈顶元素出栈,循环处理,直到当前元素小于栈顶元素,那么栈顶元素就是当前元素的下一个更大元素
33+
1、栈存放的是元素,因为用不到索引。nums1才需要索引来映射到结果数组
34+
2、从右到左遍历nums2数组,获取每个元素的下一个更大元素
35+
1)栈不为空 且 当前元素大于栈顶元素,则栈顶元素出栈,循环处理,直到当前元素小于栈顶元素,那么栈顶元素就是当前元素的下一个更大元素
3536
2)记录当前元素的下一个更大元素到map中,当前元素入栈
36-
2、遍历nums1数组,直接从map中获取当前元素的下一个更大元素,存入结果数组,返回结果
37+
3、遍历nums1数组,直接从map中获取当前元素的下一个更大元素,存入结果数组,返回结果
3738
*/
3839
class Solution {
3940
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
4041
Map<Integer, Integer> map = new HashMap<>();
4142
Deque<Integer> stack = new ArrayDeque<>();
4243
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()) {
4445
stack.pop();
4546
}
4647
map.put(nums2[i], stack.isEmpty() ? -1 : stack.peek());
@@ -53,4 +54,32 @@ public int[] nextGreaterElement(int[] nums1, int[] nums2) {
5354
}
5455
return res;
5556
}
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+
}
5685
}

leetcode_Java/Solution0503.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// 503. 下一个更大元素 II
2+
3+
4+
/*
5+
单调递减栈:
6+
1、栈存放的是索引,因为需要索引映射到结果数组
7+
2、由于是循环数组,故将两个数组拼接在一起模拟循环效果,相当于遍历两次数组,下标通过取余映射到数组索引
8+
3、从左到右遍历数组,获取每个元素的下一个更大元素
9+
1)栈不为空 且 当前元素大于栈顶元素,则栈顶元素出栈,该栈顶元素的下一个更大元素就是当前元素,记录到结果数组中,循环处理,直到当前元素小于栈顶元素
10+
2)当前元素入栈
11+
*/
12+
class Solution {
13+
public int[] nextGreaterElements(int[] nums) {
14+
Deque<Integer> stack = new ArrayDeque<>();
15+
int n = nums.length;
16+
int[] res = new int[n];
17+
Arrays.fill(res, -1);
18+
for (int i = 0; i < 2 * n; i++) {
19+
while (!stack.isEmpty() && nums[i % n] > nums[stack.peek()]) {
20+
res[stack.pop()] = nums[i % n];
21+
}
22+
stack.push(i % n);
23+
}
24+
return res;
25+
}
26+
}

0 commit comments

Comments
 (0)