力扣每日一題:5764.準(zhǔn)時(shí)到達(dá)的列車(chē)最小時(shí)速 Python二分查找服爷,精打細(xì)算的分析過(guò)程药薯!

5764.準(zhǔn)時(shí)到達(dá)的列車(chē)最小時(shí)速

難度:中等

題目:

給你一個(gè)浮點(diǎn)數(shù) hour 您朽,表示你到達(dá)辦公室可用的總通勤時(shí)間狂丝。要到達(dá)辦公室,你必須按給定次序乘坐 n 趟列車(chē)哗总。另給你一個(gè)長(zhǎng)度為 n 的整數(shù)數(shù)組 dist 几颜,其中 dist[i] 表示第 i 趟列車(chē)的行駛距離(單位是千米)。

每趟列車(chē)均只能在整點(diǎn)發(fā)車(chē)讯屈,所以你可能需要在兩趟列車(chē)之間等待一段時(shí)間蛋哭。

例如,第 1 趟列車(chē)需要 1.5 小時(shí)涮母,那你必須再等待 0.5 小時(shí)谆趾,搭乘在第 2 小時(shí)發(fā)車(chē)的第 2 趟列車(chē)躁愿。
返回能滿(mǎn)足你準(zhǔn)時(shí)到達(dá)辦公室所要求全部列車(chē)的 最小正整數(shù) 時(shí)速(單位:千米每小時(shí)),如果無(wú)法準(zhǔn)時(shí)到達(dá)沪蓬,則返回 -1 彤钟。

生成的測(cè)試用例保證答案不超過(guò) 107 ,且 hour 的 小數(shù)點(diǎn)后最多存在兩位數(shù)字 怜跑。

提示:

  • n == dist.length
  • 1 <= n <= 10**5
  • 1 <= dist[i] <= 10 ** 5
  • 1 <= hour <= 10 ** 9
  • hours 中样勃,小數(shù)點(diǎn)后最多存在兩位數(shù)字

示例:

示例 1:

輸入:dist = [1,3,2], hour = 6
輸出:1
解釋?zhuān)核俣葹?1 時(shí):
- 第 1 趟列車(chē)運(yùn)行需要 1/1 = 1 小時(shí)。
- 由于是在整數(shù)時(shí)間到達(dá)性芬,可以立即換乘在第 1 小時(shí)發(fā)車(chē)的列車(chē)峡眶。第 2 趟列車(chē)運(yùn)行需要 3/1 = 3 小時(shí)。
- 由于是在整數(shù)時(shí)間到達(dá)植锉,可以立即換乘在第 4 小時(shí)發(fā)車(chē)的列車(chē)辫樱。第 3 趟列車(chē)運(yùn)行需要 2/1 = 2 小時(shí)。
- 你將會(huì)恰好在第 6 小時(shí)到達(dá)俊庇。

示例 2:
輸入:dist = [1,3,2], hour = 2.7
輸出:3
解釋?zhuān)核俣葹?3 時(shí):
- 第 1 趟列車(chē)運(yùn)行需要 1/3 = 0.33333 小時(shí)狮暑。
- 由于不是在整數(shù)時(shí)間到達(dá),故需要等待至第 1 小時(shí)才能搭乘列車(chē)辉饱。第 2 趟列車(chē)運(yùn)行需要 3/3 = 1 小時(shí)搬男。
- 由于是在整數(shù)時(shí)間到達(dá),可以立即換乘在第 2 小時(shí)發(fā)車(chē)的列車(chē)彭沼。第 3 趟列車(chē)運(yùn)行需要 2/3 = 0.66667 小時(shí)缔逛。
- 你將會(huì)在第 2.66667 小時(shí)到達(dá)。

示例 3:
輸入:dist = [1,3,2], hour = 1.9
輸出:-1
解釋?zhuān)翰豢赡軠?zhǔn)時(shí)到達(dá)姓惑,因?yàn)榈?3 趟列車(chē)最早是在第 2 小時(shí)發(fā)車(chē)褐奴。

分析

這道題簡(jiǎn)直太符合每天卡點(diǎn)簽到的我了,從7點(diǎn)55出門(mén)開(kāi)始于毙,一直優(yōu)化到現(xiàn)在每天8點(diǎn)25風(fēng)一般的卡點(diǎn)簽到敦冬,哈哈。

這道題看到10**7唯沮,不用想就是二分脖旱,否則肯定超時(shí)!除了二分查找的時(shí)間優(yōu)化介蛉,解題過(guò)程中有哪些優(yōu)化點(diǎn)呢夯缺?

幾點(diǎn)優(yōu)化

  1. 客車(chē)每個(gè)整點(diǎn)發(fā)車(chē)

    由于每趟列車(chē)乘坐的長(zhǎng)度不同,需要我們對(duì)速度除以距離后取整甘耿。python整數(shù)相除取整公式一定要記子欢怠:
    被除數(shù) + 除數(shù) - 1 // 除數(shù),只要整數(shù)多1佳恬,就可以保證向上取整了捏境。

  2. 至少需要的小時(shí)數(shù)

    由于列車(chē)整點(diǎn)出發(fā)于游,所以速度哪怕無(wú)窮大,前n-1車(chē)座列車(chē)最少也需要n-1個(gè)小時(shí)垫言,
    最后一次列車(chē)可以忽略到無(wú)窮小贰剥。那么hour 如何小于 len(dist) -1 則肯定無(wú)法抵達(dá)。

  3. 二分的最大值是多少筷频?

    二分查找需要設(shè)置最小值和最大值蚌成,然后進(jìn)行二分操作,這道題的最大值該如何取凛捏,10**9嗎担忧?那你要多算多少次啊坯癣!
    由于題目說(shuō)了瓶盛,hour小數(shù)最多存在兩位,也就是最快0.01示罗,那么右端點(diǎn)只需設(shè)置max(dist) * 100就能滿(mǎn)足題意惩猫。
    這樣會(huì)比 10 ** 9時(shí)間復(fù)雜度降低很多!

最后需要注意一點(diǎn)蚜点,hour的小數(shù)是怎么來(lái)的轧房?因?yàn)榍皀-1次列車(chē)都是整點(diǎn)出發(fā),所以小數(shù)是通過(guò)最后一趟列車(chē)來(lái)的绍绘!
下車(chē)后就認(rèn)為到達(dá)終點(diǎn)了(地鐵里打卡的騷操作奶镶?)。所以二分只循環(huán)計(jì)算前n-1脯倒,最后一次直接除保留小數(shù)实辑。

理解了上面這些內(nèi)容捺氢,這道題就變的很簡(jiǎn)單了藻丢,但Python的效率注定再怎么優(yōu)化,耗時(shí)也渣的不行摄乒,尤其在大的數(shù)據(jù)量上更為明顯悠反。
來(lái)看看解題吧。

解題:

class Solution:
    def minSpeedOnTime(self, dist, hour):
        # 如果時(shí)間小于dist -1返回 -1
        if hour  < len(dist) - 1:
            return -1
        # 設(shè)置二分查找邊界
        left,right = 1, max(dist) * 100
        while left < right:
            cost, mid = 0, (left + right) // 2
            for i in dist[:-1]:
                cost += (i + mid - 1) // mid
                # 如果cost已經(jīng)大于hour馍佑,直接left移位斋否,重新計(jì)算
                if cost > hour:
                    left = mid + 1
                    continue
            # 單獨(dú)計(jì)算最后一次的耗時(shí)
            cost += dist[-1] / mid
            if cost > hour:
                left = mid + 1
            else:
                right = mid
        return -1 if left == 10 ** 9 else left

歡迎關(guān)注我的公眾號(hào): 清風(fēng)Python,帶你每日學(xué)習(xí)Python算法刷題的同時(shí)拭荤,了解更多python小知識(shí)茵臭。

我的個(gè)人博客:https://qingfengpython.cn

力扣解題合集:https://github.com/BreezePython/AlgorithmMarkdown

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舅世,隨后出現(xiàn)的幾起案子旦委,更是在濱河造成了極大的恐慌奇徒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缨硝,死亡現(xiàn)場(chǎng)離奇詭異摩钙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)查辩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)胖笛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宜岛,你說(shuō)我怎么就攤上這事长踊。” “怎么了谬返?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵之斯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我遣铝,道長(zhǎng)佑刷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任酿炸,我火速辦了婚禮瘫絮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘填硕。我一直安慰自己麦萤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布扁眯。 她就那樣靜靜地躺著壮莹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姻檀。 梳的紋絲不亂的頭發(fā)上命满,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音绣版,去河邊找鬼胶台。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杂抽,可吹牛的內(nèi)容都是我干的诈唬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缩麸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铸磅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阅仔,失蹤者是張志新(化名)和其女友劉穎济竹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霎槐,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡送浊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丘跌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袭景。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖闭树,靈堂內(nèi)的尸體忽然破棺而出耸棒,到底是詐尸還是另有隱情,我是刑警寧澤报辱,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布与殃,位于F島的核電站,受9級(jí)特大地震影響碍现,放射性物質(zhì)發(fā)生泄漏幅疼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一昼接、第九天 我趴在偏房一處隱蔽的房頂上張望爽篷。 院中可真熱鬧,春花似錦慢睡、人聲如沸逐工。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泪喊。三九已至,卻和暖如春髓涯,著一層夾襖步出監(jiān)牢的瞬間袒啼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工复凳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘤泪,地道東北人灶泵。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓育八,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赦邻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子髓棋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容