【发布时间】: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] > temp.peek())。我无法遵循索引与值的比较,这就是问题的原因 -
是否已知存在 O(n) 解?