File tree Expand file tree Collapse file tree 1 file changed +12
-0
lines changed Expand file tree Collapse file tree 1 file changed +12
-0
lines changed Original file line number Diff line number Diff line change 3
3
* @return {number[] }
4
4
*/
5
5
var getCollisionTimes = function ( cars ) {
6
+ //这道题必须想清楚一点,那就是如果ans[i]有正值,那么一定是cars[i]和某个cars[j](j>i且speed[j]<speed[i])
7
+ //相撞之后,所谓的融合,其实可以理解为cars[i]消失了,cars[j]状态不变
8
+ //所以我们只关注一辆车后面,不关注其前面,它的前面对它没有任何影响。可以考虑从后往前遍历
6
9
const n = cars . length
7
10
const ans = Array ( n ) . fill ( 0 )
11
+ //设立一个类似单调栈的栈,栈底最慢,栈顶最快
8
12
const stack = [ ]
9
13
for ( let i = n - 1 ; i >= 0 ; i -- ) {
10
14
while ( stack . length ) {
15
+ //如果栈顶比我快,我追不上它,可以考虑等它消失之后我去撞它前面的,所以将它pop
11
16
if ( cars [ stack [ stack . length - 1 ] ] [ 1 ] >= cars [ i ] [ 1 ] ) stack . pop ( )
17
+ //如果栈顶比我慢,我就决定去碰它了
12
18
else {
19
+ //如果它不会消失,那我肯定能碰它,break
13
20
if ( ans [ stack [ stack . length - 1 ] ] < 0 ) break
21
+ //如果它会消失,我需要计算一下在它消失之前能否追上它
14
22
const d = ans [ stack [ stack . length - 1 ] ] * ( cars [ i ] [ 1 ] - cars [ stack [ stack . length - 1 ] ] [ 1 ] )
23
+ //能追上,那我肯定碰它,break
15
24
if ( d > cars [ stack [ stack . length - 1 ] ] [ 0 ] - cars [ i ] [ 0 ] ) break
25
+ //追不上,那算了,追它前面的车
16
26
else stack . pop ( )
17
27
}
18
28
}
19
29
if ( stack . length === 0 ) ans [ i ] = - 1
20
30
else {
31
+ //相对距离除以相对速度
21
32
const t = ( cars [ stack [ stack . length - 1 ] ] [ 0 ] - cars [ i ] [ 0 ] ) / ( cars [ i ] [ 1 ] - cars [ stack [ stack . length - 1 ] ] [ 1 ] )
22
33
ans [ i ] = t
23
34
}
@@ -26,6 +37,7 @@ var getCollisionTimes = function(cars) {
26
37
return ans
27
38
} ;
28
39
40
+
29
41
// another
30
42
31
43
/**
You can’t perform that action at this time.
0 commit comments