数组中每个元素左边大于或等于它的最近元素

17 Mar 2025 | 4 分钟阅读

给定一个整数数组,我们的目标是找到其中每个元素在左侧最近的、大于或等于该元素的值。本质上,我们需要构建一个新的数组,其中每个元素都对应于原始数组左侧最近的更大或相等的值。

例如,考虑数组:[5, 9, 3, 6, 8]。根据问题标准,新数组将是:[-1, -1, 5, 9, 9]。在这种情况下,对于第一个元素“5”,其左侧没有大于或等于它的元素,因此它保持“-1”。第二个元素“9”在其左侧没有大于或等于它的值,因此也是“-1”。第三个元素“3”在其左侧的最近大于或等于它的值是“5”。同样,第四个和第五个元素“6”和“8”在其左侧也有各自最近大于或等于它们的值。

注意:在查看解决方案之前,强烈建议您先思考一种方法。

暴力破解法

解决此问题的一种直接方法是使用暴力算法。对于数组中的每个元素,我们可以遍历其左侧并找到最近的大于或等于它的值。此方法涉及嵌套循环,时间复杂度为 O(n^2),其中 'n' 是数组中的元素数量。虽然此方法在概念上很简单,但由于其效率低下,因此不适用于大型数组。

输出

Closest greater or same value on left side for every element in array

在此方法中,对于索引为 'i' 的每个元素,我们都从 'i-1' 遍历到 '0',并找到最近的大于或等于它的值。此方法的时间复杂度为 O(n^2),其中 'n' 是数组中的元素数量。

使用栈的优化方法

为了提高我们解决方案的效率,我们可以利用基于栈的方法。其思想是维护一个栈,该栈在从左到右遍历数组时,存储具有递减值的元素的索引。这确保了栈中的元素始终大于或等于当前元素。

当我们遇到每个新元素时,我们可以从栈中弹出元素,直到找到一个大于或等于当前元素的值,或者直到栈变空。栈顶元素(如果存在)的索引为我们提供了当前元素的左侧最近的大于或等于它的值。

此方法的时间复杂度为 O(n),因为每个元素在栈中最多被推入和弹出一次。栈的大小从不超过元素数量,并且每个元素都恰好处理一次。

输出

Closest greater or same value on left side for every element in array