一、问题描述


二、解题思路
(1)方法一:暴力枚举
枚举所有的可能性,初始化ret为INT_MAX,对于每一个(i,j)对(i为陆地项目的下标,j为海洋项目的下标),有2种可能性:
<1>先开始陆地,再开始海洋:time1=max(landstart+landduration,waterstart)+waterduration
<2>先开始海洋,再开始陆地:time2=max(waterstart+waterduration,landstart)+landduration
然后更新ret为min(time1,time2),完成枚举后,ret即为最短的时间,返回即可。
(2)方法二:优化枚举
通过观察我们可以知道,这个最短时间其实只有2种可能,因此我们可以优化枚举:
<1>先陆地再海洋:最早结束的陆地项目和所有的海洋项目匹配;
<2>先海洋再陆地:最早结束的海洋项目和所有的陆地项目匹配;
ret即为这2种情况的较小值,时间复杂度由O(n*m)优化为O(n+m);
三、代码实现
(1)方法一:暴力枚举(超时)
cpp
class Solution {
public:
int earliestFinishTime(vector<int>& landStartTime, vector<int>& landDuration, vector<int>& waterStartTime, vector<int>& waterDuration) {
int ret = INT_MAX;
for(int i=0;i!=landStartTime.size();i++)
for(int j=0;j!=waterStartTime.size();j++){
int landstart= landStartTime[i],landduration=landDuration[i];
int waterstart=waterStartTime[j],waterduration= waterDuration[j];
int time1=max(landstart+landduration,waterstart)+waterduration;
int time2=max(waterstart+waterduration,landstart)+landduration;
ret=min(ret,min(time1,time2));
}
return ret;
}
};
(2)方法二:优化枚举
cpp
class Solution {
public:
int earliestFinishTime(vector<int>& landStartTime, vector<int>& landDuration, vector<int>& waterStartTime, vector<int>& waterDuration) {
int ret=INT_MAX;
//先陆地项目再海洋项目:寻找最早结束的陆地项目->与每一个海洋项目匹配计算
int landfinish=INT_MAX;
for(int i=0;i!=landStartTime.size();i++)
landfinish=min(landfinish,landStartTime[i]+landDuration[i]);
for(int j=0;j!=waterStartTime.size();j++)
ret=min(ret,max(landfinish,waterStartTime[j])+waterDuration[j]);
//先海洋项目再陆地项目:寻找最早结束的海洋项目->与每一个陆地项目匹配计算
int waterfinish=INT_MAX;
for(int j=0;j!=waterStartTime.size();j++)
waterfinish=min(waterfinish,waterStartTime[j]+waterDuration[j]);
for(int i=0;i!=landStartTime.size();i++)
ret=min(ret,max(waterfinish,landStartTime[i])+landDuration[i]);
return ret;
}
};