我很难找到一个 O(n) runtine效率的算法。
如果数组大小为n,则数组包含整数。 我必须知道哪个阵列单元(可以想象为图表栏)正在查看哪个单元格。
正式:lookingAtIndex(i) = max { -1} U {j | arr[j] > arr[i], j<i}
,其中-1
代表y轴。
编辑:第一个高于当前条形图的条形图是什么?如果没有,则为Y轴 示例,提供数组:7,3,5,2,1,9 ..
然后7在y轴上看,3在7看,5看7,2在5,1和2和9在y轴上。
我有点失落,我所做的每件事都留在O(nLogn)。 它不是一个完整的排序算法,因此可以用O(n)来完成。 在运行时打印结果,无需将信息存储到最后。
答案 0 :(得分:8)
你可以用一个简单的堆栈来完成它。
Compare each element a[i] with the top of the stack T
while ( T <= a[i] )
pop T
if the stack is empty
a[i] is looking at the y-axis
else
a[i] is looking at T
push a[i] onto the stack
例如,使用数组[7,3,5,2,1,9]
a[0]=7 T=empty 7 is looking at y-axis
a[1]=3 T=7 3 is looking at 7
a[2]=5 T=3 pop 3
T=7 5 is looking at 7
a[3]=2 T=5 2 is looking at 5
a[4]=1 T=2 1 is looking at 2
a[5]=9 T=1 pop 1
T=2 pop 2
T=5 pop 5
T=7 pop 7
T=empty 9 is looking at y-axis
请注意,每个数字都被压入堆栈,每个数字只能从堆栈弹出一次,因此堆栈操作的数量最多为2N,整个算法为O(n)。
答案 1 :(得分:1)
我提出了一个线性解决方案,前面有一个很大的因素。所以我认为这可能不是最好的解决方案。
这是事情。让我们调用长度为I
的整数n
的输入数组。设M
I
中O(n)
中的最大数字I
。我首先假设M
中的最小值为0;如果不是,减去最小值不会改变解决方案,max(I)-min(I)
在一般情况下T
。
创建长度为m
的数组I
,所有元素都设置为-1。这个数组是&#34的索引的存储;看着&#34; S
中每个可能的整数的条形图;初始化为-1,虚拟最左侧栏的索引。
创建数组e
作为输出数组o&#34; look-at&#34;的索引。杆
现在,对于数组中索引为I
的{{1}}中的每个元素i
,它会查看索引正好为T[e]
的条形图。所以S[i] = T[e]
。然后使用值T[0..e]
设置所有元素i
。
在循环结束时,S
填充了&#34;查看&#34;的索引。酒吧;很容易找回这些酒吧的价值。
如您所见,总体复杂度为O(M*n)
,因此复杂度与I
的长度呈线性关系。由于我之前说过的因素M
,它可能效率不高(欢迎任何改进)。
修改强>
更喜欢user3386109的解决方案,相比之下,我很尴尬。
答案 2 :(得分:0)
让我们说我们有一个完成的阵列:...... A - B,
和lookingAtIndex(A)= X,让我们找到B的结果: 如果A> B然后它是A,否则A和lookingAtIndex(A)之间的所有索引都不是一个好的答案,因为它们小于A, 如果lookingAtIndex(A)&gt;那么它的答案就是看看atIndex(lookingAtIndex(A))等...
但是您需要一种方法来存储每个索引的条形图,我认为user3386109给出的堆栈的想法是一个非常好的实现,并且您只需要存储所需的值< / p>