【二分】B019_LC_小張刷題計劃(貪婪)

一、Problem

n 道題,編號從 0 到 n-1,並計劃在 m 天內按照題目編號順序刷完所有的題目(注意,小張不能用多天完成同一題)。

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

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

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

限制:

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

二、Solution

方法一:二分

題意

time[i] 表示 ii 題需要的時間,你可以將題目分成 m 天來做,其中每份只可以可捨去一道題,問至少要多少天才能把題目做完

我們肯定是不做耗時最長的那一道題的,然後如果做題時間超出了 T,那麼就要新開一天做剩下的題

class Solution {
    boolean chk(int T, int m, int[] a) {
        int maxT = 0, sum = 0, c = 1;
        for (int t : a) {
            if (sum + t - Math.max(t, maxT) <= T) {
                sum += t;
                maxT = Math.max(maxT, t);
            } else {
                if (++c > m) return false;
                sum = maxT = t;
            }
        }
        return true;
    }
    public int minTime(int[] a, int m) {
        int n = a.length, l = 0, r = (int) 1e9;

        while (l < r) {
            int T = l + r >>> 1;
            if (chk(T, m, a)) r = T;
            else              l = T+1;
        }
        return r;
    }
}

複雜度分析

  • 時間複雜度:O()O()
  • 空間複雜度:O()O()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章