Java Q查询后的输出数组将某些元素设置为零
Q查询是在由N个元素组成的数组上执行的。在每个查询中,选择索引I并执行以下操作Java Q查询后的输出数组将某些元素设置为零,java,arrays,algorithm,data-structures,Java,Arrays,Algorithm,Data Structures,Q查询是在由N个元素组成的数组上执行的。在每个查询中,选择索引I并执行以下操作 for j = I + 1 to N: if A[j] < A[I]: A[j] = 0 对于j=I+1到N: 如果A[j]A[I]时解决了这个问题(见下文),这似乎更有趣:) 为了解决A[j]
for j = I + 1 to N:
if A[j] < A[I]:
A[j] = 0
对于j=I+1到N:
如果A[j]
数组A在处理Q查询后是什么样子的
1 <= N,Q <= 10^5
1 <= A <= 10^9
Test Case :
5 2 (N Q)
4 3 4 3 2
3 2 (Q queries)
solution : 4 3 4 0 0
3 1 (N Q)
3 2 1
2
solution : 3 2 1
1我首先误读了这个问题,并在A[j]>A[I]
时解决了这个问题(见下文),这似乎更有趣:)
为了解决A[j]
的问题,对于每个元素,我们想知道在将其设置为零之前,左侧是否有更大的元素被查询。惊喜如果在查询之前将其变为零,则表示在左侧查询了更大的元素
我们可以在O(n)
时间和O(| Q |)
空间中解决这个问题(假设我们使用输入空间作为输出)。将查询索引放入O(1)
lookup的集合中。从左向右遍历并维护最大查询元素的单个变量(起始值为0)。如果当前元素小于所看到的最大元素,则在输出中将其标记为零。如果元素被查询且大于所查询的最大元素
,则更新所查询的最大元素
4 3 4 3 2
Queries 3 2
4 largest_queried 0
3 largest_queried 0
4 largest_queried 4
3 < 4 so set to 0 (largest_queried stays the same)
2 < 4 so set to 0
432
问题3 2
4最大值0
3最大值0
4最大的问题4
3<4,因此设置为0(查询的最大值保持不变)
2<4,因此设置为0
A[j]>A[i]
我们可以在O(nlogn)
时间和O(n)
空间中解决这个问题。假设所有非负元素,对于每个数组元素,我们想知道(1)左侧是否有任何较低的元素被查询,或者(2)给定查询顺序作为时间,在某个时间t
设置为零后,左侧是否有任何相等或较高的元素被查询
沿着查询列表或映射从左到右遍历数组,附加时间标志表示查询顺序(例如,[(1,2)、(2,0)]
表示索引1在时间2查询,索引2在时间0查询)
维护一个到目前为止被查询的元素树,按其值排序,并用左子树中显示的最短时间进行修饰。如果相同的查询值在较早的时间出现,请更新时间
对于每个元素,在查询的元素树中查找值较低的最近节点。如果存在,则在输出中将元素标记为0。如果元素也被查询过,并且时间晚于我们在树中找到的相应时间装饰,则将值0随查询时间一起插入到查询元素树中(或者,如果0已在树中且时间较晚,则只更新时间装饰)。似乎查询的顺序不会影响结果,所以问题变成了寻找最有效的订单。你能分享一个问题的链接吗?到目前为止你做了哪些尝试/研究?分享您的发现。提示:前缀数组:)@MrSmith42我尝试了暴力方法,无法找到有效的解决方案。我们应该对查询进行排序吗?@seanzig关于A[j]