備案的網站名稱寫什么深圳整站全網推廣
文章目錄
- 題目
- 標題和出處
- 難度
- 題目描述
- 要求
- 示例
- 數據范圍
- 解法
- 思路和算法
- 代碼
- 復雜度分析
題目
標題和出處
標題:兩球之間的磁力
出處:1552. 兩球之間的磁力
難度
5 級
題目描述
要求
在代號為地球 C-137 的世界中,Rick 發(fā)現如果他將兩個球放在他新發(fā)明的籃子中,它們之間會形成特殊形式的磁力。Rick 有 n \texttt{n} n 個空的籃子,第 i \texttt{i} i 個籃子的位置在 position[i] \texttt{position[i]} position[i],Morty 想把 m \texttt{m} m 個球放到這些籃子中,使得任意兩球間的最小磁力最大。
Rick 聲明,兩個位于 x \texttt{x} x 和 y \texttt{y} y 的球之間的磁力為 |x - y| \texttt{|x - y|} |x?-?y|。
給定一個整數數組 position \texttt{position} position 和一個整數 m \texttt{m} m,返回最小磁力的最大值。
示例
示例 1:
輸入: position = [1,2,3,4,7], m = 3 \texttt{position = [1,2,3,4,7], m = 3} position?=?[1,2,3,4,7],?m?=?3
輸出: 3 \texttt{3} 3
解釋:將 3 \texttt{3} 3 個球分別放入位于 1 \texttt{1} 1、 4 \texttt{4} 4 和 7 \texttt{7} 7 的三個籃子,兩球間的磁力分別為 [3, 3, 6] \texttt{[3, 3, 6]} [3,?3,?6]。最小磁力為 3 \texttt{3} 3。我們無法讓最小磁力大于 3 \texttt{3} 3。
示例 2:
輸入: position = [5,4,3,2,1,1000000000], m = 2 \texttt{position = [5,4,3,2,1,1000000000], m = 2} position?=?[5,4,3,2,1,1000000000],?m?=?2
輸出: 999999999 \texttt{999999999} 999999999
解釋:我們使用位于 1 \texttt{1} 1 和 1000000000 \texttt{1000000000} 1000000000 的籃子時最小磁力最大。
數據范圍
- n = position.length \texttt{n} = \texttt{position.length} n=position.length
- 2 ≤ n ≤ 10 5 \texttt{2} \le \texttt{n} \le \texttt{10}^\texttt{5} 2≤n≤105
- 1 ≤ position[i] ≤ 10 9 \texttt{1} \le \texttt{position[i]} \le \texttt{10}^\texttt{9} 1≤position[i]≤109
- 所有 position \texttt{position} position 中的整數各不相同
- 2 ≤ m ≤ position.length \texttt{2} \le \texttt{m} \le \texttt{position.length} 2≤m≤position.length
解法
思路和算法
由于兩個球之間的磁力等于兩個球之間的距離,因此為了得到最小磁力,需要計算最小距離。以下將最小磁力的最大值對應的最小距離的最大值稱為「臨界距離」。
當 m m m 個球已經放入籃子時,最小距離一定是其中一對位置相鄰的球之間的距離,因此需要將數組 position \textit{position} position 升序排序,在排序后的籃子位置之間計算放入的球的最小距離。
如果任意兩個球之間的距離不超過臨界距離,則可以放入至少 m m m 個球;如果存在兩個球之間的距離大于臨界距離,則不能放入 m m m 個球。因此,這道題是二分查找判定問題,需要找到可以放入 m m m 個球的最小距離的最大值。
用 low \textit{low} low 和 high \textit{high} high 分別表示二分查找的下界和上界。由于至少需要放入兩個球,當最小距離最大時每個球放在不同的籃子中,因此 low \textit{low} low 的初始值等于 1 1 1;由于最大距離為兩端的籃子之間的距離,因此 high \textit{high} high 的初始值等于 position \textit{position} position 中的最大值與最小值之差。
為了能放入 m m m 個球,當最小距離確定時,應該在確保相鄰的球之間的距離不小于最小距離的前提下盡可能放入更多的球。因此,第一個球應該放到最左邊的籃子中,后面的每個球應該放到與前一個球的距離大于等于最小距離的最近的籃子中。根據該規(guī)則,遍歷排序后的數組 position \textit{position} position,判斷每個球應該放到哪些籃子中,并計算放到籃子中的球的總數。
每次查找時,取 mid \textit{mid} mid 為 low \textit{low} low 和 high \textit{high} high 的平均數向上取整,將 mid \textit{mid} mid 作為最小距離,判斷是否可以將 m m m 個球放到籃子中,執(zhí)行如下操作。
-
如果最小距離是 mid \textit{mid} mid 時可以將 m m m 個球放到籃子中,則臨界距離大于等于 mid \textit{mid} mid,因此在 [ mid , high ] [\textit{mid}, \textit{high}] [mid,high] 中繼續(xù)查找。
-
如果最小距離是 mid \textit{mid} mid 時不能將 m m m 個球放到籃子中,則臨界距離小于 mid \textit{mid} mid,因此在 [ low , mid ? 1 ] [\textit{low}, \textit{mid} - 1] [low,mid?1] 中繼續(xù)查找。
當 low = high \textit{low} = \textit{high} low=high 時,查找結束,此時 low \textit{low} low 即為臨界距離。
得到臨界距離之后,臨界距離對應的磁力即為最小磁力的最大值。
代碼
class Solution {public int maxDistance(int[] position, int m) {Arrays.sort(position);int n = position.length;int low = 1, high = position[n - 1] - position[0];while (low < high) {int mid = low + (high - low + 1) / 2;if (canPutMBalls(position, m, mid)) {low = mid;} else {high = mid - 1;}}return low;}public boolean canPutMBalls(int[] position, int m, int force) {int count = 1;int prev = position[0];int n = position.length;for (int i = 1; i < n; i++) {if (position[i] - prev >= force) {count++;if (count == m) {return true;}prev = position[i];}}return false;}
}
復雜度分析
-
時間復雜度: O ( n log ? ( n p ) ) O(n \log (np)) O(nlog(np)),其中 n n n 是數組 position \textit{position} position 的長度, p p p 是數組 position \textit{position} position 中的最大值。排序需要 O ( n log ? n ) O(n \log n) O(nlogn) 的時間,排序之后需要執(zhí)行 O ( log ? p ) O(\log p) O(logp) 次二分查找,每次二分查找需要 O ( n ) O(n) O(n) 的時間遍歷數組 position \textit{position} position 判斷是否可以將 m m m 個球放到籃子中,二分查找共需要 O ( n log ? p ) O(n \log p) O(nlogp) 的時間,因此時間復雜度是 O ( n log ? n + n log ? p ) = O ( n log ? ( n p ) ) O(n \log n + n \log p) = O(n \log (np)) O(nlogn+nlogp)=O(nlog(np))。
-
空間復雜度: O ( log ? n ) O(\log n) O(logn),其中 n n n 是數組 position \textit{position} position 的長度。排序需要 O ( log ? n ) O(\log n) O(logn) 的遞歸調用??臻g。