853. 车队
题目难度 Medium
题目描述: N 辆车沿着一条车道驶向位于 target 英里之外的共同目的地。每辆车 i 以恒定的速度 speed[i] (英里/小时),从初始位置 position[i] (英里) 沿车道驶向目的地。一辆车永远不会超过前面的另一辆车,但它可以追上去,并与前车以相同的速度紧接着行驶。此时,我们会忽略这两辆车之间的距离,也就是说,它们被假定处于相同的位置。车队 是一些由行驶在相同位置、具有相同速度的车组成的非空集合。注意,一辆车也可以是一个车队。即便一辆车在目的地才赶上了一个车队,它们仍然会被视作是同一个车队。
会有多少车队到达目的地?
总结:
方法一(执行用时1044ms):
1. 对于每一辆车都有位置和速度两种数据,而要判断车A是否能追上车B,只需判断车A到达终点的时间是否小于车B到达终点的时间。因此,我们需要先计算出每一辆车到达终点的时间,并用一个数组存起来。
2. 但在之前,为了便于比较,先对position数组和speed数组同时排序,按离终点的距离由近及远。
3. 计算每一辆车的时间并存于time数组,用一层循环搞定,位移除以速度。
4. 接下来(从离终点由近及远,也就是从time数组开头)遍历整个time数组,用一个临时变量strat保存当前车队的时间(初始化为第一个time),然后遍历time数组,如果strat >=time[i], 即离终点更近的车队用时比后面的车队t还多,所以后面的车队t将要追上车队strat,此时将 i 自增指向下一个time来寻找是否还有后面的车队追上strat车队;;如果strat<time[i] , 表明后面的车队 i 已无法追上strat车队,所以储存到达终点的车队数的变量anns+1,并将strat赋值为time[i] , ;;直至循环结束。
5. 遍历完之后实际上还有一个车队未计入anns,自加。但是,如果本身的position数组为空,则会输出车队为1的错误,因此最后需要用一个条件判断。
下给出代码:
class Solution {
public:
int carFleet(int target, vector<int>& position, vector<int>& speed) {
double *time = new double [position.size()];
int anns=0;
for(int i=0;i<position.size();i++) //选择法排序
for(int j=i+1;j<position.size();j++)
{
if(position[i]<position[j])
{
swap(position[i],position[j]);
swap(speed[i],speed[j]);
}
}
for(int i=0;i<position.size();i++)
time[i]=(target-position[i])/(speed[i]*1.0);
double strat=time[0];
for(int i=0;i<position.size();) //遍历time[]
{
if(strat>=time[i])
i++;
else
{
anns++;
strat=time[i++];
}
}
anns++;
if(position.size()==0)anns=0; //
return anns;
}
};
方法二(执行用时28ms范例):
下给出代码:
class Solution {
public:
int carFleet(int target, vector<int>& position, vector<int>& speed) {
map<int,int>ps;
for(int i=0;i<position.size();i++){
ps[position[i]]=speed[i];
}
int result=0;
double time=0;
map<int,int>::reverse_iterator rit=ps.rbegin();
for(;rit!=ps.rend();rit++){
if((target-rit->first)*1.0/rit->second>time){
result+=1;
time=(target-rit->first)*1.0/rit->second;
}
}
return result;
}
};