1. 問題描述:
在代號為 c-137 的地球上,rick 發現如果他將兩個球放在他新發明的籃子裡,它們之間會形成特殊形式的磁力。rick 有 n 個空的籃子,第 i 個籃子的位置在 position[i] ,morty 想把 m 個球放到這些籃子裡,使得任意兩球間 最小磁力 最大。
已知兩個球如果分別位於 x 和 y ,那麼它們之間的磁力為 |x - y| 。
給你乙個整數陣列 position 和乙個整數 m ,請你返回最大化的最小磁力
示例 1:
輸入:position = [1,2,3,4,7], m = 3
輸出:3
解釋:將 3 個球分別放入位於 1,4 和 7 的三個籃子,兩球間的磁力分別為 [3, 3, 6]。最小磁力為 3 。我們沒辦法讓最小磁力大於 3 。
示例 2:
2. 思路分析:
① 一開始的時候沒有什麼思路,看了一下領扣精選的題解,發現一位大佬的**寫得真是不錯(題解**),使用二分查詢的思路解決的,下面是對於大佬思路的理解
② 二分查詢首先要求是有序的,所以需要對position陣列進行排序,然後需要確定二分查詢的左右邊界,最小的磁力邊界比較好想,為position陣列相鄰元素中的最小值:因為籃子具體的位置是確定的,最小的間隔肯定是相鄰位置最小的那個,最小的磁力邊界的最大取值可以這樣想:我們只有將這些球按照均勻的間隔放置在這些籃子中那麼得到的磁力間隔肯定是最小間隔之中最大的,也就是平均的取值那麼就為最小的磁力邊界的最大取值
③ 接下來進行二分查詢,二分查詢在擴充套件左邊界的時候也就是將最小的磁力邊界往較大的邊界擴充套件的時候需要判斷一下,這裡可以使用乙個函式來檢查:我們需要是否可以將球以當前的距離放置在這些籃筐上,依次迴圈迭代即可累加可以放置的球的位置
3. **如下:
import sys
from typing import list
class solution:
def check(self, x: int, a: list[int], m: int):
count = 0
target = a[0] + x
for i in range(1, len(a)):
if a[i] >= target:
count += 1
target = a[i] + x
return count >= m - 1
def maxdistance(self, position: list[int], m: int) -> int:
# 二分查詢
position.sort()
diff = position[len(position) - 1] - position[0]
mm = sys.maxsize
for i in range(len(position) - 1):
if mm > position[i + 1] - position[i]:
mm = position[i + 1] - position[i]
if m == 2: return diff
l, r = mm, diff // (m - 1)
while l <= r:
mid = (l + r) // 2
if self.check(mid, position, m):
l = mid + 1
else:
r = mid - 1
return l - 1
1552 兩球之間的磁力
在代號為 c 137 的地球上,rick 發現如果他將兩個球放在他新發明的籃子裡,它們之間會形成特殊形式的磁力。rick 有 n 個空的籃子,第 i 個籃子的位置在 position i morty 想把 m 個球放到這些籃子裡,使得任意兩球間 最小磁力 最大。已知兩個球如果分別位於 x 和 y 那...
兩種二分查詢
給定按照非遞減序的陣列和關鍵字key,返回key在給定陣列中的下標,若不存在則返回 1。二分查詢的關鍵是控制好下標low和high,以及返回值。最後要返回的是下標low的值 比如給定排好序的陣列nums和要查詢的關鍵字key,返回關鍵字key在陣列中的下標。假設要查詢的關鍵字在陣列中存在。這兩個方法...
二分查詢的平均查詢長度 二分查詢
資料的查詢在計算機的操作中非常常見,那麼我們應該怎樣在計算機中實現查詢操作呢?最簡單的一種方法 傻找 也就是乙個乙個的找,我們把陣列中的每個元素都和我們想要查詢的目標元素進行比對,看一下列表中是否有和這個元素相同的元素,如果我們想要尋找的那個目標元素在列表 現了,那麼就宣告查詢成功,這種演算法寫成 ...