当前位置: 面试刷题>> 下一个更大的数 (经典算法题500道)
### 题目描述补充
题目:**下一个更大的数(Next Greater Element)**
给定一个正整数数组 `nums`,找出每个元素的“下一个更大元素”。数组的每个元素 `nums[i]` 的下一个更大元素是指 `nums` 中满足 `nums[j] > nums[i]` 的 `nums[j]` 的最小值,其中 `j > i`;如果不存在这样的元素,则对应位置输出 `-1`。
例如,给定数组 `[1,2,1]`,输出应为 `[2, -1, -1]`。因为第一个 `1` 的下一个更大元素是 `2`,第二个 `2` 后面没有更大的元素,所以输出 `-1`,同理,最后一个 `1` 后面也没有更大的元素,输出 `-1`。
### 示例代码
#### PHP 代码示例
```php
function nextGreaterElement($nums) {
$stack = []; // 使用栈来保存元素索引
$result = array_fill(0, count($nums), -1); // 初始化结果数组,全为-1
for ($i = 0; $i < count($nums); $i++) {
while (!empty($stack) && $nums[$i] > $nums[end($stack)]) {
$result[array_pop($stack)] = $nums[$i]; // 弹出栈顶元素,并更新其结果为当前值
}
$stack[] = $i; // 将当前索引压入栈
}
return $result;
}
// 示例
$nums = [1, 2, 1];
$result = nextGreaterElement($nums);
print_r($result);
```
#### Python 代码示例
```python
def nextGreaterElement(nums):
stack = [] # 使用栈来保存元素索引
result = [-1] * len(nums) # 初始化结果数组,全为-1
for i in range(len(nums)):
while stack and nums[i] > nums[stack[-1]]:
result[stack.pop()] = nums[i] # 弹出栈顶元素,并更新其结果为当前值
stack.append(i) # 将当前索引压入栈
return result
# 示例
nums = [1, 2, 1]
result = nextGreaterElement(nums)
print(result)
```
#### JavaScript 代码示例
```javascript
function nextGreaterElement(nums) {
const stack = []; // 使用栈来保存元素索引
const result = new Array(nums.length).fill(-1); // 初始化结果数组,全为-1
for (let i = 0; i < nums.length; i++) {
while (stack.length > 0 && nums[i] > nums[stack[stack.length - 1]]) {
result[stack.pop()] = nums[i]; // 弹出栈顶元素,并更新其结果为当前值
}
stack.push(i); // 将当前索引压入栈
}
return result;
}
// 示例
const nums = [1, 2, 1];
const result = nextGreaterElement(nums);
console.log(result);
```
在以上三个示例中,均使用了单调栈的概念来解决问题,这种方法在处理这类问题时非常高效。每个示例都包含了对栈的基本操作,以及如何通过遍历数组来更新结果数组。通过这些代码,你可以清晰地看到如何找到每个元素的下一个更大元素。