力扣853.车队
题目解析及思路
题目要求求出到达终点时并排的车量 ,其中后车在追上前车时会降到同样的速度
可以看作一个数轴,每辆车的位置从大到小排序,如果前车被追上,后车的速度一定大于前车
即有(target - p1)/s1 < (target - p2)/s2
,避免浮点数错误,转化成乘法计算
为(long long)(target - p1) * s2 < (long long)(target - p2) * s1
- 按照初始位置排序
- 遍历每两辆车,如果满足后车追上前车
- ans ++,同时更新速度为后车速度,继续判断
代码
cpp
class Solution {
typedef pair<int,int> PII;
public:
int carFleet(int target, vector<int>& position, vector<int>& speed) {
int n = position.size();
vector<PII> v;
for(int i=0;i<n;i++)
v.emplace_back(position[i],speed[i]);
sort(v.begin(),v.end(),[](PII a,PII b){
return a.first > b.first;
});
int ans = 1;
int p1 = v[0].first,s1 = v[0].second;
for(int i=1;i<n;i++)
{
int p2 = v[i].first,s2 = v[i].second;
if((long long)(target - p1) * s2 < (long long)(target - p2) * s1)
{
ans ++;
//不用管中间的变速过程,即使p1会减小,s1会增大,后车只与前面紧邻的那辆车比较
p1 = p2;
s1 = s2;
}
}
return ans;
}
};