LeetCode2. 小張刷題計劃

1. 題目

爲了提高自己的代碼能力,小張制定了 LeetCode 刷題計劃,他選中了 LeetCode 題庫中的 n 道題,編號從 0 到 n-1,並計劃在 m 天內按照題目編號順序刷完所有的題目(注意,小張不能用多天完成同一題)。

在小張刷題計劃中,小張需要用 time[i] 的時間完成編號 i 的題目。此外,小張還可以使用場外求助功能,通過詢問他的好朋友小楊題目的解法,可以省去該題的做題時間。爲了防止“小張刷題計劃”變成“小楊刷題計劃”,小張每天最多使用一次求助。

我們定義 m 天中做題時間最多的一天耗時爲 T(小楊完成的題目不計入做題總時間)。請你幫小張求出最小的 T是多少。
示例 1:

輸入:time = [1,2,3,3], m = 2

輸出:3

解釋:第一天小張完成前三題,其中第三題找小楊幫忙;第二天完成第四題,並且找小楊幫忙。這樣做題時間最多的一天花費了 3 的時間,並且這個值是最小的。

限制:

1 <= time.length <= 10^5
1 <= time[i] <= 10000
1 <= m <= 1000

leetcode 鏈接

2. 解答

二分法。這裏儘量得平均每天的刷題量,知道每天刷題量的範圍,通過二分法查找,從而知道最小的刷題量。

class Solution:
    def minTime(self, time: List[int], m: int) -> int:
        if m>= len(time):
            return 0
        start = 0
        end = sum(time)//m + 1
        while start < end:
            mid = (start + end)//2
            curD = 1
            curT = 0
            maxT = 0
            for t in time:
                curT += t
                maxT = max(maxT,t)
                if curT-maxT > mid:
                    curT = t 
                    curD += 1
                    maxT = t
            if curD > m:
                start = mid + 1
            else:
                end = mid
        return end
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章