文章目录
- 1. 题目
- 2. 解题
1. 题目
在一条单车道上有 n 辆车,它们朝着同样的方向行驶。
给你一个长度为 n 的数组 cars ,其中 cars[i] = [positioni, speedi]
,它表示:
positioni
是第 i 辆车和道路起点之间的距离(单位:米)。
题目保证positioni < positioni+1
。- speedi 是第 i 辆车的初始速度(单位:米/秒)。
简单起见,所有车子可以视为在数轴上移动的点。
当两辆车占据同一个位置时,我们称它们相遇了。
一旦两辆车相遇,它们会合并成一个车队,这个车队里的车有着同样的位置和相同的速度,速度为这个车队里 最慢 一辆车的速度。
请你返回一个数组 answer ,其中 answer[i] 是第 i 辆车与下一辆车相遇的时间(单位:秒),如果这辆车不会与下一辆车相遇,则 answer[i] 为 -1 。
答案精度误差需在 10-5 以内。
示例 1:
输入:cars = [[1,2],[2,1],[4,3],[7,2]]
输出:[1.00000,-1.00000,3.00000,-1.00000]
解释:经过恰好 1 秒以后,第一辆车会与第二辆车相遇,并形成一个 1 m/s 的车队。
经过恰好 3 秒以后,第三辆车会与第四辆车相遇,并形成一个 2 m/s 的车队。示例 2:
输入:cars = [[3,4],[5,4],[6,3],[9,1]]
输出:[2.00000,1.00000,1.50000,-1.00000]提示:
1 <= cars.length <= 10^5
1 <= positioni, speedi <= 10^6
positioni < positioni+1
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/car-fleet-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
类似题目:LeetCode 853. 车队(排序)
class Solution {
public:vector<double> getCollisionTimes(vector<vector<int>>& cars) {int n = cars.size();vector<double> ans(n, -1.0);stack<int> s;for(int i = n-1; i >= 0; i--) {while(!s.empty() && (cars[s.top()][1] >= cars[i][1] || (ans[s.top()] > 0 && delta(cars, i, s.top()) > ans[s.top()]))){ // 我的速度没有前车大,追不上前面的,检查再前面的人,前面可能有更慢的//前车 top 能撞上别人 且 撞上别人的时间 小于 我撞上top的时间,那我应该去跟更前面的人计算// 因为前车 top 已经先于我 撞上更前面的s.pop();}if(!s.empty())ans[i] = delta(cars, i, s.top());s.push(i);}return ans;}double delta(vector<vector<int>>& cars, int i, int j)//j 位置远,速度慢{return (cars[j][0] - cars[i][0])/double(cars[i][1] - cars[j][1]);}
};
572 ms 122.8 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!