719 找出第 k 小的距離對(二分查詢)

2021-10-09 08:22:46 字數 1472 閱讀 5008

1. 問題描述:

給定乙個整數陣列,返回所有數對之間的第 k 個最小距離。一對 (a, b) 的距離被定義為 a 和 b 之間的絕對差值。

示例 1:

輸入:nums = [1,3,1]

k = 1

輸出:0 

解釋:所有數對如下:

(1,3) -> 2

(1,1) -> 0

(3,1) -> 2

因此第 1 個最小距離的數對是 (1,1),它們之間的距離為 0。

2 <= len(nums) <= 10000.

0 <= nums[i] < 1000000.

1 <= k <= len(nums) * (len(nums) - 1) / 2.

2. 思路分析:

① 其實這道題目比較隱晦,但是仔細分析起來也是存在一些特點的,首先我們從題目中可以得到最小距離與最大距離的,最小距離為0,最大距離為排序之後的首尾元素之差,而我們的想法是在這個範圍之內找出第k小的距離,這個就有點像二分查詢的模型了,已知了乙個最大與最小的範圍,我們需要在這個範圍之內找到不斷縮小範圍從而得到正確的答案,對於這道題目來說我們需要通過二分檢查當前得到的距離(mid = (l + r) // 2)中在nums的所有數對中是否存在大於等於k個數對使得距離是mid,假如成立我們可以縮小右邊界,說明可能存在更小的距離使得數對的距離是等於mid的,假如不成立那麼那麼將左邊界向右擴充套件一點,最後我們返回l即可

② 本質上還是需要知道這個是乙個二分查詢的模型,確定左右邊界與更新左右邊界的策略即可

3. **如下:

from typing import list

class solution:

def check(self, x, a: list[int], k: int):

res, index = 0, 1

for i in range(len(a)):

j = index

while j < len(a) and a[j] <= a[i] + x:

j += 1

# 記錄上一次索引

res += j - i - 1

index = j

return res >= k

def smallestdistancepair(self, nums: list[int], k: int) -> int:

nums.sort()

l, r = 0, nums[- 1] - nums[0]

while l <= r:

mid = (l + r) // 2

if self.check(mid, nums, k):

r = mid - 1

else:

l = mid + 1

return l

leetcode 719 找出第 k 小的距離對

描述 給定乙個整數陣列,返回所有數對之間的第 k 個最小距離。一對 a,b 的距離被定義為 a 和 b 之間的絕對差值。示例 1 2 len nums 10000.0 nums i 1000000.1 k len nums len nums 1 2.思路桶排序 class solution for ...

poj3685(二分查詢第k小)

translation 給出乙個矩陣,其中每項的值為 i i c i j j c j i j i,j分別為所在的行和列 求其第m小的數字 solution 二分查詢k小數字 觀察發現矩陣的規律是從上倒下遞增,從左到右遞減。可以根據這個規律來二分查詢有幾個小於當前給出的值。詳見 note date 2...

靜態區間第K小(整體二分 主席樹)

題目鏈結 題解主席樹入門題 但是這裡給出整體二分解法 整體二分顧名思義是把所有操作放在一起二分 想想,如果求 1 n 的第 k 小怎麼二分求得?我們可以二分答案 k o n 統計有多少個數小於等於 k 如果對於每個詢問都這麼搞,肯定不行 我們可以發現,如果每次都搞一次,有許多算重複的地方 div l...