【二分】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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章