2024/11/28 灵茶题单 单调栈

This commit is contained in:
Cool 2024-11-28 16:14:11 +08:00
parent 44bfda06ef
commit 7327e78f3c
1 changed files with 42 additions and 0 deletions

View File

@ -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最后遍历结束的时候栈的元素数量就是车队数量
* <p>
* 作者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<Double> 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();
}
}