線上程式設計介紹
阿裡雲開發者社群線上程式設計産品,針對廣大開發者學習、實踐、面試、應聘、考試認證等打造的免費線上刷題神器。題庫來自筆試模拟題、算法大賽模拟題等,界面整潔明了,操作簡單,為使用者營造專心答題的學習環境。點選連結開始體驗:
https://developer.aliyun.com/coding本文為大家介紹其中的 第61題:能量半徑 的題目解析,具體如下:
題目描述
題目等級:中等
知識點:二分查找、樹狀數組
檢視題目:能量半徑codancer來到了一個能量平面上的中心,坐标為(0,0),接下來巫師Tom會在q個坐标上放置能量點,每個能量點的能量值為1,為了打敗哥斯拉,他需要至少k點的能量,是以他想确定一個最小的整數半徑r使得codancer能夠從這個圓心為(0,0),半徑為r的圓形區域内得到至少k個能量值,請你幫他确定最小的整數半徑r。
輸入包含三個部分,第一個輸入能量點的個數q(1<=q<=100000),第二個輸入必須獲得的最小能量值k(0<=k<=q),第三個是q個坐标(xi,yi),(-100000<=xi<=100000,-100000<=yi<=100000并且xi和yi都是整數)。
輸出一個正整數r,表示最小的半徑。
示例1
輸入:
4
3
[[1,1],[-1,1],[-1,-1],[2,3]]
輸出:
2
注意
當半徑為2的時候可以收集到1,1,[-1,-1]處的能量。
解題思路:排序算法
題目的含義就是找到距離原點最近的第k個點,并求它的半徑。
計算過程:
- 計算每個點到原點的距離,為了減少計算量可以隻計算到平方。使用long[n]這樣的數組來儲存。使用long類型是為了防止平方之後結果超出int類型範圍。
- 對距離進行從小到大排序
- 取排序後的第k個數值開根号,轉化為int類型并加1。加1是因為開根号後可能為小數,轉化成int類型會直接舍去小數部分,導緻結果比實際小一些。
這個題的關鍵在于排序算法。
使用最簡單的冒泡排序,時間複雜度O(n^2);
使用快速排序等好一點的排序算法,時間複雜度O(nlog(n));
也可以使用java中Arrays類中的sort函數。
看完之後是不是有了想法了呢,快來練練手吧>>
