【问题标题】:Find nearest bigger value for all elements of array为数组的所有元素找到最接近的较大值
【发布时间】:2020-12-16 13:23:19
【问题描述】:

我正在寻找一种快速算法(或任何提示)来执行此操作;

  • 形式上,对于数组的每个元素ai,找到索引j
    • j > 我
    • aij
    • j - i 是最小值

这是一个示例和 O(n^2) 实现

    std::vector<double> v = { 3, 1.5, 4, 2, 5 };
    
    std::vector<int> out(v.size());
    
    for (int i = 0; i < v.size(); i++)
    {
        out[i] = -1;
        for (int j = i + 1; j < v.size(); j++)
        {
            if (v[j] > v[i])
            {
                out[i] = j;
                break;
            }
        }
    }
            
    for (int i : out) std::cout << i << ' '; // => 2 2 4 4 -1

【问题讨论】:

  • 除非你知道数组是有序的,否则我认为O(N^2)是你能做到的最好的吗?
  • 我相信你想做的和this一样? Modified implementation.

标签: c++ arrays algorithm


【解决方案1】:

按照下面提到的步骤,可以使用 O(n) 时间复杂度的堆栈轻松完成:

第 1 步:维护一个可以存储索引的堆栈。

第 2 步: 遍历数组并检查以下条件: 条件:如果数组顶部索引处的元素小于当前索引处的元素,则与顶部索引最近的较大元素为当前元素。 p>

第 3 步:将当前索引推入堆栈。

示例: [8,4,2,5,9]

dp = [-1,-1,-1,-1,-1] # 存储索引的数组

迭代 1:

元素 = 8

堆栈 = [] # 空

将 0 推入堆栈(索引为 8)

迭代 2:

元素 = 4

堆栈 = [0]

将 1 推入堆栈(索引为 4)

迭代 3:

元素 = 2

堆栈 = [0,1]

将 2 推入堆栈(索引为 2)

迭代 4:

元素 = 5

堆栈 = [0,1,2]

从堆栈中弹出 -> 2 个元素 = 2

dp[2] = 3

从堆栈中弹出 -> 1 个元素 = 4

dp[1] = 3

将 3 推入堆栈(索引为 5)

迭代 5:

元素 = 9

堆栈 = [0,3]

从堆栈中弹出 -> 3 个元素 = 5

dp[3] = 4

从堆栈中弹出 -> 0 个元素 = 8

dp[0] = 4

将 4 推入堆栈(索引为 9)

现在您对 array = [8 4 2 5 9] 的答案存储在数组 dp 中:

[4,3,3,4,-1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2012-11-28
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多