LeetCode破解之旅途时间

136 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;反之同理。