【问题标题】:In an array, find an optimized algorithm for finding sum of lengths of longest subarray with current element being the highest in the subarray在一个数组中,找到一个优化的算法来求最长子数组的长度总和,当前元素是子数组中的最高元素
【发布时间】:2021-01-20 20:34:37
【问题描述】:

我有一个类似 [1,3,5] 的数组。对于这些元素中的每一个,我需要找到当前元素最高的最长子数组。答案将是所有子数组的长度之和。

解释。

index - 0 : Element 1 -> 元素小于当前元素的最长子数组 = [1]

index - 1 : Element 3 -> 元素小于当前元素的最长子数组 = [1,3]

index - 2 : Element 5 -> 元素小于当前元素的最长子数组 = [1,3,5]

最终答案 = 1 + 2 + 3 = 6 [单个子数组的长度]

我能够想出一个蛮力 O(N ^ 2) 来解决这个问题。有没有更好的方法来解决这个问题?

【问题讨论】:

  • 你需要一个更好的例子。如果数组是排序的,就像你当前的例子一样,答案就是1+2+...+N = N(N+1)/2

标签: algorithm dynamic-programming


【解决方案1】:

我会给你两个提示。

提示 1: 时间复杂度和空间复杂度 O(n) 的解是可能的。n 是给定数组 Arr 中的元素数。 dynamic-programming 标签会导致大脑坚持使用它,而不是探索其他可能的解决方案。

现在停下来,在进一步阅读之前自己尝试一下。

.

.

.

.

故意留空以避免让您无意中阅读第二个提示

.

.

.

.

提示 2:使用单调堆栈。

现在停下来,在进一步阅读之前自己尝试一下。

我喜欢解决这个问题,谢谢! 下面的解决方案是直接一次通过,仅使用堆栈空间。

我将向您展示一个模拟,而不是提供常规样式的逐行算法。

Index:  0   1   2   3   4   5   
Arr:    44  91  58  54  7   38  

上面给出的解决方案是否正确?

长度之和 = 17。所以,我们有一个正确的解决方案。

后续问题: 如果Arr 中存在重复项,上述解决方案是否有效?如果不是,您将对上述算法进行哪些更改以使其正常工作?提示:与><= 一起玩会有帮助吗?

【讨论】:

    【解决方案2】:

    只需在两个方向记录next greater element 的索引,然后为每个元素查找它们。 O(n) 空间和时间。

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2021-11-16
      • 2022-01-03
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多