Skip to content

Commit 4a21ffb

Browse files
committed
Create 0503. 下一个更大元素 II.md
1 parent c8b6224 commit 4a21ffb

1 file changed

Lines changed: 45 additions & 0 deletions

File tree

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
## [0503. 下一个更大元素 II](https://leetcode-cn.com/problems/next-greater-element-ii/)
2+
3+
- 标签:栈、数组、单调栈
4+
- 难度:中等
5+
6+
## 题目大意
7+
8+
给定一个循环数组 `nums`(最后一个元素的下一个元素是数组的第一个元素)。
9+
10+
要求:输出每个元素的下一个更大元素。如果不存在,则输出 `-1`
11+
12+
- 数字 `x` 的下一个更大的元素:按数组遍历顺序,这个数字之后的第一个比它更大的数。这意味着你应该循环地搜索它的下一个更大的数。
13+
14+
## 解题思路
15+
16+
第一种思路是根据题意直接暴力求解。遍历 `nums` 中的每一个元素。对于 `nums` 的每一个元素 `nums[i]`,查找 `nums[i]` 右边第一个比 `nums1[i]` 大的元素。这种解法的时间复杂度是 $O(n^2)$。
17+
18+
第二种思路是使用单调递增栈。遍历数组 `nums`,构造单调递增栈,求出 `nums` 中每个元素右侧下一个更大的元素。然后将其存储到答案数组中。这种解法的时间复杂度是 $O(n)$。
19+
20+
而循环数组的求解方法可以将 `nums` 复制一份到末尾,生成长度为 `len(nums) * 2` 的数组,或者通过取模运算将下标映射到 `0` ~ `len(nums) * 2 - 1` 之间。
21+
22+
具体做法如下:
23+
24+
- 使用数组 `res` 存放答案,初始值都赋值为 `-1`。使用变量 `stack` 表示单调递增栈。
25+
- 遍历数组 `nums`,对于当前元素:
26+
- 如果当前元素值小于栈顶元素,则说明当前元素「下一个更大元素」与栈顶元素的「下一个更大元素」相同。应该直接让当前元素的下标入栈。
27+
- 如果当前元素值大于栈顶元素,则说明当前元素是之前元素的「下一个更大元素」,则不断将栈顶元素出栈。直到当前元素值小于栈顶元素值。
28+
- 出栈时,出栈元素的「下一个更大元素」是当前元素。则将当前元素值存入到答案数组 `res` 中出栈元素所对应的位置中。
29+
- 最终输出答案数组 `res`
30+
31+
## 代码
32+
33+
```Python
34+
size = len(nums)
35+
res = [-1 for _ in range(size)]
36+
stack = []
37+
for i in range(size * 2):
38+
while stack and nums[i % size] > nums[stack[-1]]:
39+
index = stack.pop()
40+
res[index] = nums[i % size]
41+
stack.append(i % size)
42+
43+
return res
44+
```
45+

0 commit comments

Comments
 (0)