Problem: 853. 车队

思路:

采用单调递减栈,单调栈中存放所有可能的车队到达终点需要的时间。(注意,只保存位置最大的那个车辆,也就是车队中速度最慢的车辆)。我们需要对数组按照postion升序排列,然后从左到右遍历。

如果当前车辆到达时间大于等于栈顶车辆的时间,说明栈顶车辆能追上当前车辆,将栈顶车辆弹出,当前车辆入栈,将它两合并成一个车队。如果当前车辆到达时间小于栈顶车辆达到时间,说明栈顶车辆追不上当前车辆,那么将当前车辆入栈。循环结束后,单调栈的大小就是车队的数量。

复杂度

  • 时间复杂度: O(nlog(n)),瓶颈在排序的复杂度上。当然,也可以采用空间换时间的方法,利用target大小的数组来保存数据。
  • 空间复杂度: O(n)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int carFleet(int target, int[] position, int[] speed) {
int n = position.length;
int[][] traffic = new int[n][2];
for (int i = 0; i < n; i ++) {
traffic[i][0] = position[i];
traffic[i][1] = speed[i];
}
Arrays.sort(traffic, (a, b) -> Integer.compare(a[0], b[0]));
Deque<Double> st = new ArrayDeque<>();
for (int i = 0; i < n; i ++) {
double time = (double) (target - traffic[i][0]) / traffic[i][1];
while (!st.isEmpty() && st.peek() <= time) {
st.pop();
}
st.push(time);
}
return st.size();
}
}