【问题标题】:Output array after Q queries set some elements to zeroQ 查询后的输出数组将某些元素设置为零
【发布时间】:2019-12-10 05:30:40
【问题描述】:

Q 查询在 N 个元素的数组 A 上执行。在每个查询中,选择一个索引 I 并执行以下操作。

for j = I + 1 to N:
  if A[j] < A[I]:
    A[j] = 0

处理完 Q 查询后数组 A 的样子。

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

提示是使用高级排序算法

在第一个测试用例中:
第一次查询后的数组 {4, 3, 4, 3, 0}
第二次查询后的数组 {4, 3, 4, 0, 0}

我尝试了蛮力方法,遍历每个查询。想不出有效的方法。

【问题讨论】:

  • 似乎查询的顺序不会影响结果,所以问题就变成了找到最有效的顺序。
  • 你能分享一个问题的链接吗?
  • 到目前为止尝试/研究了什么?分享您的发现。
  • 提示:前缀数组:)
  • @MrSmith42 我尝试了蛮力方法,无法提出有效的解决方案。

标签: java arrays algorithm data-structures


【解决方案1】:

我首先误读了问题,解决了A[j] &gt; A[I]时的问题(见下文),这似乎更有趣:)

为了解决A[j] &lt; A[I] 的问题,对于每个元素,我们想知道左边是否有一个更大的元素在它可能被设置为零之前被查询。惊喜!如果在被查询之前就变为零,则表示向左查询了一个更大的元素。

我们可以在O(n) 时间和O(|Q|) 空间解决这个问题(假设我们使用输入空间作为输出)。将查询索引放在一组O(1) 查找中。从左到右遍历并保持最大查询元素的单个变量(起始值为0)。如果当前元素小于largest_seen_queried_element,则在输出中将其标记为零。如果查询到的元素大于largest_seen_queried_element,则更新largest_seen_queried_element

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

A[j] &gt; A[i] 的解决方案

我们可以在O(n log n) 时间和O(n) 空间解决这个问题。假设所有非负元素,对于每个数组元素,我们想知道是否有 (1) 左侧被查询的任何较低元素,或 (2) 给定查询顺序作为时间,任何相等或更高的元素在时间t 被查询的左边,在某个时间t' &lt; t 被设置为零之后。

在查询的列表或映射旁边从左到右遍历数组,并带有表示其顺序的附加时间标志(例如,[(1, 2), (2, 0)] 表示索引 1 在时间 2 被查询,索引 2 在时间 0 被查询)。

维护到目前为止看到的被查询的元素树,按它们的值排序,用左子树中看到的最低时间装饰。如果相同的查询值出现更早的时间,则更新时间修饰。

对于每个元素,在查询元素树中查找最近的较低值节点。如果存在,则在输出中将该元素标记为 0。如果该元素也被查询了,并且在我们在树中找到的相应时间修饰之后,则将值 0 插入到查询元素的树中(或者只是更新如果 0 已经在树中,则时间装饰)。

【讨论】:

  • 我们应该对查询进行排序吗?
  • @seazig 对于您关于 A[j]
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
相关资源
最近更新 更多