【问题标题】:Find out how many values are smaller up to a value in an array找出有多少值小于数组中的一个值
【发布时间】:2021-12-09 17:16:25
【问题描述】:

问题如下:

令 P 为正整数数组。我需要根据这个定义创建一个数组 S:

S[i] 包含小于或等于 P[i] 的元素个数。

这必须在线性时间内完成 - O(n)。

示例:如果 P=[2,7,4,5,9,12],则 S=[0,1,0,1,4,5]。

那是因为 P[0] 有零个元素小于或等于它(最多 P[0]),所以 S[0]=0,而 P[1] 只有 P[0] 小于它(最多到 P[1]),所以 S[1]=1,依此类推。

这是我的尝试(在 Java 中):

我的尝试是对数组进行单次传递,并利用堆栈将先前的索引存储在 P 中。遗憾的是,这是一次失败的尝试,因为对于输入 P=[17,4,2,0,15 ] 输出不正确。

这是我写的代码:

public static int[] build_s(int[] p) {
    IntegerStack temp = new IntegerStack(p.length);
    temp.push(0);
    int[] s = new int[p.length];
    int max = p[0];
    for (int i = 0; i < p.length; i++) {
        if (p[i] >= max) {
            s[i] = i+1;
            max = p[i];
        } else if (p[i-1] > p[i]) {
            if (p[i] > temp.peek())
                temp.push(i);
            s[i] = 1;
        } else {
            s[i] = (i - temp.peek());
        }
    }
    return s;
}

如果能帮助我的算法正常工作,我将不胜感激。我可以看到当有 4,2,0,15 之类的序列破坏算法时会出现问题,但我无法在 O(n) 时间内找出解决方案。

谢谢!

【问题讨论】:

  • 也包括测试数据,因为您有几乎可以运行的示例。
  • 我的意思是在代码中。
  • 示例S[i] 看起来不像小于或等于P[i]的元素数量。它看起来 元素的数量 P[j] ≤ P[i] 其中 j :解释 S[3] == 1.
  • 我想我不明白这里temp 的目的。它应该持有什么指数?有一张支票if (p[i] &gt; temp.peek())。我无法遵循索引与值的比较,这就是问题的原因
  • 是否已知存在 O(n) 解?

标签: java algorithm


【解决方案1】:

在线性时间复杂度(即O(n))中,无法找到小于或等于当前位置左侧的元素的计数。

让我们假设这样的算法存在O(N) 时间复杂度。然后通过使用这个“算法”的结果,在原始给定数组中应用一次,然后在反转它一次后,我们可以在O(N)时间找到排序后的数组。

现在我们知道,即使在最好的情况下,对由随机整数组成的数组进行排序的时间复杂度也是 O(N*logN)

因此,我们的假设是错误的,这样的算法不存在

【讨论】:

    【解决方案2】:

    O(nlog(n)) 中解决此问题的一种方法是使用Fenwick/BIT。但是BIT 构造空间需要数组中的size 等于maximum 值(假设数组中的所有元素都是正数)。 BIT数组的构造是O(size)。对于数组中的每个元素,您需要插入1 作为BIT 数组中的值,对于小于当前元素的元素的每个查询将是O(log(size))。所以总时间复杂度将是O(sizelog(size))。这里sizeBIT 数组的长度。你可以了解更多关于BIThere

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2016-01-07
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2019-06-20
      • 2013-03-01
      相关资源
      最近更新 更多