力扣1776 車隊 單調棧維護斜率最值

2021-10-20 19:45:49 字數 2237 閱讀 5778

題目大意:

一維平面上給你n

nn個汽車在位置p

ip_i

pi​,以速度v

iv_i

vi​往右行駛。當兩車相遇的時候,速度變為兩車最慢速度。現在問你每個車它與下一輛車(車隊)相遇的時間。

n ≤1

e5n \leq 1e5

n≤1e5

題目思路:

顯然我們有乙個暴力的n

2n^2

n2,對每個車,求出它與後面那些車相遇的最短時間.

畫在s −v

s-vs−

v二維座標系中,我們就是要求t=s

j−si

vi−v

jt=\frac

t=vi​−

vj​s

j​−s

i​​的最小值.那麼就是求點對之間的斜率最大值.

分析過程:

這個我們可以利用單調棧來實現:令入棧順序為:cn,

cn−1

,...

,c1c_n,c_,...,c_1

cn​,cn

−1​,

...,

c1​假設當前點為c

ic_i

ci​,棧頂元素c

xc_x

cx​,

0.若棧為空,則它不會與任何車相遇。

1.若其速度大於等於c

ic_i

ci​,則它倆永遠不會相遇,則它對c

ic_i

ci​的答案的更新沒有作用,也對之後的點沒有作用。(因為c

ic_i

ci​是cx,

x∈[1

,i]c_x,x\in[1,i]

cx​,x∈

[1,i

]的速度瓶頸,後面的車速度無法超過c

ic_i

ci​).所以將其彈出棧頂.

2.1否則,假設棧頂元素和它的最大斜率配對為:(cx

,cy)

,x<

y(c_x,c_y),x(c

x​,c

y​),

x<

y.那麼如果ki,x,y

k_ki,x​

,y​.則ki,

y>ki

,xk_>k_

ki,y

​>ki

,x​(k

kk為點對斜率).這種情況用白話講就是:c

ic_i

ci​會在c

xc_x

cx​和c

yc_y

cy​相遇之後再匯合。所以對於c

ic_i

ci​來講,瓶頸就是c

yc_y

cy​.所以這個時候我們就需要將c

xc_x

cx​彈出棧,繼續這個過程,如下圖所示:

2.2 反之的話,ki,y,x

k_ < k_

ki,y​,x

​.這種情況用白話講就是:c

ic_i

ci​會在c

xc_x

cx​和c

yc_y

cy​相遇之前與c

xc_x

cx​匯合。那麼答案就是(ci

,cx)

(c_i,c_x)

(ci​,c

x​).這個時候停止這個過程即可.如下圖所示:

2.3 結束這個過程後將i

ii入棧.

從上面兩個過程可以看出,我們的單調棧就會維護乙個下凸包.因為這樣是最優的。

class
solution

vector<

double

>

getcollisiontimes

(vector

int>>

& a)

if(res ==

1e9) ans[i]=-

1;else ans[i]

= res;

}return ans;}}

;

LeetCode 853 車隊 排序

n 輛車沿著一條車道駛向位於 target 英里之外的共同目的地。每輛車 i 以恆定的速度 speed i 英里 小時 從初始位置 position i 英里 沿車道駛向目的地。一輛車永遠不會超過前面的另一輛車,但它可以追上去,並與前車以相同的速度緊接著行駛。此時,我們會忽略這兩輛車之間的距離,也就...

力扣 1094 拼車

拼車問題 假設你是一位順風車司機,車上最初有 capacity 個空座位可以用來載客。由於道路的限制,車 只能 向乙個方向行駛 也就是說,不允許掉頭或改變方向,你可以將其想象為乙個向量 這兒有乙份乘客行程計畫表 trips,其中 trips i num passengers,start locati...

力扣 單調棧與單調佇列問題

單調棧 1.402.移掉k位數字 需要注意邊界情況,去除完無字元返回 判斷時不能有 號,棧內應該是不嚴格遞增的。2.316.去除重複字母 需要借助雜湊表來統計出現次數,並且標記是否已經存在於棧內。3.84.柱狀圖中最大的矩形,挺難的,針對每乙個柱需要確定左右比它低的作為邊界,正向遍歷單調棧確定左邊界...