Skip to content

Commit 300039d

Browse files
committed
496.下一个更大元素I,单调递减栈,哈希表
1 parent 4b6d091 commit 300039d

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

leetcode_Java/DoneTitle.txt

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

leetcode_Java/Solution0496.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// 496. 下一个更大元素 I
2+
3+
4+
/*
5+
暴力:
6+
1、初始化结果数组为-1,表示不存在的情况
7+
2、两个for循环遍历数组,flag标记表示找到了nums1的x在nums2的位置,再往后遍历时比x大就记录该值
8+
*/
9+
class Solution {
10+
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
11+
int n = nums1.length, m = nums2.length;
12+
int[] res = new int[n];
13+
Arrays.fill(res, -1);
14+
for (int i = 0; i < n; i++) {
15+
boolean flag = false;
16+
for (int j = 0; j < m; j++) {
17+
if (nums1[i] == nums2[j]) {
18+
flag = true;
19+
}
20+
if (flag && nums1[i] < nums2[j]) {
21+
res[i] = nums2[j];
22+
break;
23+
}
24+
}
25+
}
26+
return res;
27+
}
28+
}
29+
30+
31+
/*
32+
单调递减栈:
33+
1、从右到左遍历nums2数组,获取每个元素的下一个更大元素
34+
1)栈不为空 且 当前元素大于等于栈顶元素,则栈顶元素出栈,循环处理,直到当前元素小于栈顶元素,那么栈顶元素就是当前元素的下一个更大元素
35+
2)记录当前元素的下一个更大元素到map中,当前元素入栈
36+
2、遍历nums1数组,直接从map中获取当前元素的下一个更大元素,存入结果数组,返回结果
37+
*/
38+
class Solution {
39+
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
40+
Map<Integer, Integer> map = new HashMap<>();
41+
Deque<Integer> stack = new ArrayDeque<>();
42+
for (int i = nums2.length - 1; i >= 0; i--) {
43+
while (!stack.isEmpty() && nums2[i] >= stack.peek()) {
44+
stack.pop();
45+
}
46+
map.put(nums2[i], stack.isEmpty() ? -1 : stack.peek());
47+
stack.push(nums2[i]);
48+
}
49+
int n = nums1.length;
50+
int[] res = new int[n];
51+
for (int i = 0; i < n; i++) {
52+
res[i] = map.get(nums1[i]);
53+
}
54+
return res;
55+
}
56+
}

0 commit comments

Comments
 (0)