持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
题目描述
给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。
每辆公交车可以 连续 完成多趟旅途,也就是说,一辆公交车当前旅途完成后,可以 立马开始 下一趟旅途。每辆公交车 独立 运行,也就是说可以同时有多辆公交车在运行且互不影响。
给你一个整数 totalTrips ,表示所有公交车 总共 需要完成的旅途数目。请你返回完成 至少 totalTrips 趟旅途需要花费的 最少 时间。
示例 1:
输入:time = [1,2,3], totalTrips = 5 输出:3 解释:
- 时刻 t = 1 ,每辆公交车完成的旅途数分别为 [1,0,0] 。 已完成的总旅途数为 1 + 0 + 0 = 1 。
- 时刻 t = 2 ,每辆公交车完成的旅途数分别为 [2,1,0] 。 已完成的总旅途数为 2 + 1 + 0 = 3 。
- 时刻 t = 3 ,每辆公交车完成的旅途数分别为 [3,1,1] 。 已完成的总旅途数为 3 + 1 + 1 = 5 。
所以总共完成至少 5 趟旅途的最少时间为 3 。
二分
这个题目我的初步思路是:其实稍微分析一下,就可以看出来这个题目是一个经典的二分题目,很清晰的思路。思路的核心关键是找出二分的上界,可以通过将每个最大值视为一个单位时间,以单位时间来测算出来最大的大概会有多少时间。具体实现的思路:
- 首先设定二分搜索的边界为0——time[0]*totalTrips。
- 我们在进行二分搜索的过程中,设定mid值就是(left+right)/2。
- 不断的维护变换mid值和进行边界收缩,直到全部处理。
class Solution {
public long minimumTime(int[] time, int totalTrips) {
Arrays.sort(time);
int len= time.length;
long left=1,right= (long) time[len - 1] *totalTrips;
while (left<right){
long mid=left+(right-left)/2;
long count=0;
for (int t:time){
count+=mid/t;
}
if (count>=totalTrips)
right=mid;
else
left=mid+1;
}
return left;
}
}
最后
注意点:判断二分边界的条件是当前的mid为时间的前提下,一共可以完成的路程数。那么判断这个路程是否大于totalTrips,就说明时间应该小一点,因此right=mid-1;反之同理。