小张刷题计划
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 214 ms, 内存: 26.5 MB
/*
* 题目思路:
* 1. 使用stream来计算左右边界。
* 2. 其他部分与普通Java解法类似,只是运用了stream。
*/
import java.util.Arrays;
public class LeetCodeSolutionStream {
public int minTime(int[] time, int m) {
int left = Arrays.stream(time).max().getAsInt();
int right = Arrays.stream(time).sum();
while (left < right) {
int mid = (left + right) / 2;
if (canFinish(time, m, mid)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
private boolean canFinish(int[] time, int m, int maxTime) {
int days = 1, totalTime = 0;
for (int t : time) {
if (totalTime + t > maxTime) {
days++;
totalTime = t;
if (days > m) return false;
} else {
totalTime += t;
}
}
return true;
}
}
解释
方法:
题解采用了二分查找结合贪心算法的策略。首先定义f函数,该函数用于判断在最大单日时间T的限制下,小张完成所有题目需要的天数。对于每道题,我们维护当前天的总时间s和当天最耗时的题目时间max_time。如果添加新题会使总时间s超过T,那么新开一天,并将当前题作为新一天的第一题。在minTime函数中,通过调整T的值(二分查找)来找到使得f函数返回的天数不超过m的最小T值。
时间复杂度:
O(n log(sum(time)))
空间复杂度:
O(1)
代码细节讲解
🦆
在二分查找的过程中,为什么`low`的初始值设为0,而不是考虑题目中可能存在的最小耗时?
▷🦆
题解中提到使用`max_time`来记录最耗时的题目,这种策略在哪些情况下可能会导致不必要的天数增加?
▷🦆
在确定二分搜索的上界时,为什么选择`sum(time)`作为上界,这是否意味着在某些情况下一个人一天内可能尝试完成所有题目?
▷