diff --git a/src/main/java/com/cool/ling_cha_mount/stack/Num853.java b/src/main/java/com/cool/ling_cha_mount/stack/Num853.java new file mode 100644 index 0000000..68e95cb --- /dev/null +++ b/src/main/java/com/cool/ling_cha_mount/stack/Num853.java @@ -0,0 +1,42 @@ +package com.cool.ling_cha_mount.stack; + +import org.junit.Test; + +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Deque; +import java.util.LinkedList; + +public class Num853 { + /** + * ————单调栈十六字真言:及时去掉无用数据,保证栈中元素有序。———— + * 1、首先我们清楚题目说了前车是无法超过后车的。如果追上之后就会按照车队中速度最慢的那个速度继续前行。所以我们可以求出从每个位置出发,到达终点所需时间是多少的这个数组。O(n) + * 2、拥有这个数组之后,我们从起始位置遍历。根据到达的时间可以将每个车队花费时间最长到达终点的时间作为这个车队的特征标签存到一个栈中。 + * 3、首先清楚当前车是在前车后面的,后车不能超过我。如果当前车出发到终点的所需时间>=栈顶车队到终点的所需时间(我开的慢,也就是前车都比我快会被我堵住所以就要跟着我走。我前面的车队就会和我形成一个车队,并且以我为准了),此时直接栈顶出栈,说明前面的车队和我要合并了。保证栈内元素是单调增的(从底到顶)。 + * 4、最后将自己入栈,作为一个车队! + * 5、最后遍历结束的时候,栈的元素数量就是车队数量。 + *

+ * 作者:ELK + * 链接:https://leetcode.cn/problems/car-fleet/solutions/2903448/dan-diao-zhan-chao-guo-9961-by-mi-lu-yu-ba1o2/ + * 来源:力扣(LeetCode) + * 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 + */ + public int carFleet(int target, int[] position, int[] speed) { + double[] spendTime = new double[target]; + Deque stack = new ArrayDeque<>(); + for (int i = 0; i < position.length; i++) { + spendTime[position[i]] = (double) (target - position[i]) / speed[i]; + } + Arrays.sort(position); + for (int i = 0; i < target; i++) { + if (spendTime[i] > 0) { + while (!stack.isEmpty() && spendTime[i] >= stack.peek()) { + stack.pop(); + } + stack.push(spendTime[i]); + } + + } + return stack.size(); + } +}