簡體   English   中英

在網格中找到第 K 個最小元素?

[英]Find the Kth min element in the grid?

我們給定一個大小為N * N網格,其中每個元素A[i][j]由這個等式(i + j) ^ 2 + (ji) * 10^5計算。

我們需要以優化的方式找到第K 個最小元素

約束

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

如何有效地解決這個問題?

您嘗試解決的問題(在無序數組中查找第 k 個最小元素)稱為選擇問題 有很多方法可以解決這個問題,其中最著名的方法之一是快速 select 算法

您可以在 O(N log N) 時間內解決此問題。 請注意,這在矩陣的大小上是次線性的,即 N*N。 當然,您永遠不應該實際構建矩陣。

首先,它有助於查看矩陣中的值是什么的:

請注意,在矩陣大小的可能范圍內,最小元素始終位於 (i,j) = (N-1,0)。

最大元素將是 (0,N-1) 或 (N-1,N-1),具體取決於矩陣的大小。

從最小到最大考慮線上的元素。 如果您選擇其中任何一個元素,則可以跟蹤輪廓以在 O(N) 時間內找到 <= 元素的數量。

此外,這一行的元素總是從最小到最大單調遞增,所以對這一行元素進行二分搜索,找到最大的一個,使得 <= 元素的數量為 < k。 在每個測試的 O(N) 時間,這需要 O(N log N) 一起。

假設您發現的元素具有值 x,並且元素的數量 <= x 是 r,其中 r < k。 接下來跟蹤該線上下一個更高元素的輪廓,調用它的值 y,並列出所有值 v 使得 x < v <= y。 此列表中將有 O(N) 個元素,這僅需要 O(N) 時間。

最后,只需使用排序或快速選擇從該列表中選擇第 (kr) 個元素。 同樣,這最多需要 O(N log N) 時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM