5453. 所有螞蟻掉下來前的最後一刻
有一塊木板,長度爲 n
個 單位 。一些螞蟻在木板上移動,每隻螞蟻都以 每秒一個單位 的速度移動。其中,一部分螞蟻向 左 移動,其他螞蟻向 右 移動。
當兩隻向 不同 方向移動的螞蟻在某個點相遇時,它們會同時改變移動方向並繼續移動。假設更改方向不會花費任何額外時間。
而當螞蟻在某一時刻 t
到達木板的一端時,它立即從木板上掉下來。
給你一個整數 n
和兩個整數數組 left
以及 right
。兩個數組分別標識向左或者向右移動的螞蟻在 t = 0
時的位置。請你返回最後一隻螞蟻從木板上掉下來的時刻。
示例 1:
輸入:n = 4, left = [4,3], right = [0,1] 輸出:4 解釋:如上圖所示: -下標 0 處的螞蟻命名爲 A 並向右移動。 -下標 1 處的螞蟻命名爲 B 並向右移動。 -下標 3 處的螞蟻命名爲 C 並向左移動。 -下標 4 處的螞蟻命名爲 D 並向左移動。 請注意,螞蟻在木板上的最後時刻是 t = 4 秒,之後螞蟻立即從木板上掉下來。(也就是說在 t = 4.0000000001 時,木板上沒有螞蟻)。
示例 2:
輸入:n = 7, left = [], right = [0,1,2,3,4,5,6,7] 輸出:7 解釋:所有螞蟻都向右移動,下標爲 0 的螞蟻需要 7 秒才能從木板上掉落。
示例 3:
輸入:n = 7, left = [0,1,2,3,4,5,6,7], right = [] 輸出:7 解釋:所有螞蟻都向左移動,下標爲 7 的螞蟻需要 7 秒才能從木板上掉落。
示例 4:
輸入:n = 9, left = [5], right = [4] 輸出:5 解釋:t = 1 秒時,兩隻螞蟻將回到初始位置,但移動方向與之前相反。
示例 5:
輸入:n = 6, left = [6], right = [0] 輸出:6
提示:
1 <= n <= 10^4
0 <= left.length <= n + 1
0 <= left[i] <= n
0 <= right.length <= n + 1
0 <= right[i] <= n
1 <= left.length + right.length <= n + 1
left
和right
中的所有值都是唯一的,並且每個值 只能出現在二者之一 中。
比賽的時候沒有做出來,當時想複雜了,想着通過每個時間更新以下螞蟻的狀態,最後的時間即爲結果,實現比較複雜就沒繼續進行。後來看到大神們的解決代碼後,思考了以下,發現實際上只需要比較初始所有螞蟻距離掉落的時間,取最大值即爲結果。因爲在運動中,雖然會發生碰撞,但碰撞的實際情況對應的所有螞蟻的運動狀態其實並沒有改變,因爲當兩隻螞蟻碰撞相互調轉方向後,可以視爲兩隻螞蟻互換方向,但由於速度不變,其實相當於未發生碰撞(即螞蟻變了,但只是完成的使命互換了而已,其代替彼此繼續運動)
class Solution {
public:
int getLastMoment(int n, vector<int>& left, vector<int>& right) {
int res = 0;
for (auto x : left)
{
res = max(res, x);
}
for (auto x : right)
{
res = max(res, n-x);
}
return res;
}
};