当前位置: 面试刷题>> 下一个更大的数 (经典算法题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 代码示例

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 代码示例

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 代码示例

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);

在以上三个示例中,均使用了单调栈的概念来解决问题,这种方法在处理这类问题时非常高效。每个示例都包含了对栈的基本操作,以及如何通过遍历数组来更新结果数组。通过这些代码,你可以清晰地看到如何找到每个元素的下一个更大元素。

推荐面试题