力扣第 282 场周赛 :完成旅途的最少时间

简介: 给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟 旅途 所需要花费的时间。

12.png

一、问题描述


给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。


每辆公交车可以 连续 完成多趟旅途,也就是说,一辆公交车当前旅途完成后,可以 立马开始 下一趟旅途。每辆公交车 独立 运行,也就是说可以同时有多辆公交车在运行且互不影响。


给你一个整数 totalTrips ,表示所有公交车 总共 需要完成的旅途数目。请你返回完成 至少totalTrips 趟旅途需要花费的 最少 时间。


题目链接:完成旅途的最少时间


二、题目要求

样例

输入: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


考察

二分查找建议用时20~40min


三、问题分析


1.png

一开始我想的思路是,时间t慢慢向上加。每一辆公交车的旅途数目,可以直接用时间/花费时间,返回最小的时间数就行。这也是最简单的算法,但很遗憾超时了,怎么优化也不行。

3.png

后来结束之后去看大佬的题解,发现这一题居然可以用二分算法解决,想破脑袋都没想到:


接下来详细说一下步骤:

  • 完成这段旅途最少的时间是0(不需要走),最长时间是一辆最快的公交车自己完成这个旅途
  • 先对数组time从小到大排序,那么二分法的左边界left为0,right为time[0]*totalTrips,mid=left+(right-left)/2,这不二分法的三要素已经浮出水面了
  • mid代表当前花费的时间总数,我们要计算出在mid的时间下,完成这段旅途数目sum
  • sum>=totalTrips,向左缩小区间 right=mid
  • sum
  • 退出循环,返回left


四、编码实现


classSolution {
public:
longlongminimumTime(vector<int>&time, inttotalTrips) {  
longlonginti,sum,n=time.size(),left,right,mid;//初始化相关数据sort(time.begin(),time.end());//从小到大排序left=0,right=1L*time[0]*totalTrips;//左侧边界 右侧边界while(left<right)//循环判断        {
mid=left+(right-left)/2;//中间值midsum=0;//旅途数初始化for(i=0;i<n;i++)//公交车完成一趟旅途所需要花费的时间循环            {
if(time[i]>mid)
break;
sum+=mid/time[i];//求出旅途数            }
if(sum>=totalTrips)
right=mid;//向左缩小区间elseleft=mid+1;//向右缩小区间        }
returnleft;//输出结果    }
};

五、测试结果2.png

相关文章
|
5月前
|
Go
golang力扣leetcode 第 291 场周赛
golang力扣leetcode 第 291 场周赛
61 0
|
5月前
|
Go vr&ar
golang力扣leetcode 第 288 场周赛
golang力扣leetcode 第 288 场周赛
51 0
|
5月前
|
Go
golang力扣leetcode 第 286 场周赛
golang力扣leetcode 第 286 场周赛
55 0
|
算法 Android开发
LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
63 1
|
5月前
|
Go
golang力扣leetcode第 294 场周赛
golang力扣leetcode第 294 场周赛
51 0
|
5月前
|
算法 Java Go
golang力扣leetcode 第 293 场周赛
golang力扣leetcode 第 293 场周赛
81 0
|
5月前
|
Go
golang力扣leetcode 第 290 场周赛
golang力扣leetcode 第 290 场周赛
48 0
|
5月前
|
Go C++
golang力扣leetcode 第 284 场周赛
golang力扣leetcode 第 284 场周赛
57 0
|
5月前
|
存储
Leetcode第383场周赛
在LeetCode第383场周赛中,选手完成了3道题目。第一题是关于边界上的蚂蚁,蚂蚁根据非零整数数组nums的值移动,返回蚂蚁返回边界上的次数。解题方法是计算数组累加和为0的次数。第二题涉及计算网格的区域平均强度,给定一个灰度图像和阈值,返回每个像素所属区域的平均强度。解题关键在于理解相邻像素和区域定义,并计算平均强度。第三题是恢复单词初始状态的最短时间问题,通过移除前k个字符并添加k个字符,求恢复原词所需的最短时间。解题策略是检查去除前k个字符后的子串是否能作为原词的前缀。
30 1
Leetcode第383场周赛
|
5月前
|
Go
golang力扣leetcode 第 292 场周赛
golang力扣leetcode 第 292 场周赛
62 0