【问题标题】:Find the Kth min element in the grid?在网格中找到第 K 个最小元素?
【发布时间】:2022-01-04 13:48:00
【问题描述】:

我们得到一个大小为N * N网格,其中每个元素A[i][j] 都是通过这个公式(i + j) ^ 2 + (j-i) * 10^5 计算出来的。

我们需要以优化的方式找到第K个最小元素

约束

1 <= number of test cases <= 20 
1 <= N <= 5*10^4 
1 <= k <= N^2

如何有效地解决这个问题?

【问题讨论】:

  • 你试过什么?这也是java还是C++?它们是非常不同的语言。
  • 我尝试了蛮力,但时间太长了。就像找到网格中的每个元素一样,对其进行排序并选择第 K 个元素 @ShadowMitia
  • 向我们展示代码,我们可以从那里开始提供帮助。

标签: java c++ algorithm math data-structures


【解决方案1】:

您尝试解决的问题(在无序数组中查找第 k 个最小元素)称为 the selection problem。有很多方法可以解决这个问题,其中最著名的方法之一是the quick select algorithm

【讨论】:

    【解决方案2】:

    你可以在 O(N log N) 时间内解决这个问题。请注意,这在矩阵的大小上是次线性的,即 N*N。当然,您永远不应该实际构建矩阵。

    首先,看看矩阵looks like中的值是什么:

    请注意,在可能的矩阵大小范围内,最小元素始终位于 (i,j) = (N-1,0)。

    最大元素将是 (0,N-1) 或 (N-1,N-1),具体取决于矩阵的大小。

    从最小到最大考虑线上的元素。如果您选择其中任何一个元素,那么您可以跟踪轮廓以在 O(N) 时间内找到

    此外,这一行的元素总是从最小到最大单调递增,所以对这一行元素进行二分查找,找到最大的一个,使得

    假设您发现的元素具有值 x,并且元素

    最后,只需使用排序或快速选择从该列表中选择第 (k-r) 个元素。同样,这最多需要 O(N log N) 时间。

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 2015-01-15
      • 2019-08-13
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      相关资源
      最近更新 更多