【思維題】B012_LC_所有螞蟻掉下來前的最後一刻(記錄最大距離)

一、Problem

有一塊木板,長度爲 n 個 單位 。一些螞蟻在木板上移動,每隻螞蟻都以 每秒一個單位 的速度移動。其中,一部分螞蟻向 左 移動,其他螞蟻向 右 移動。

當兩隻向 不同 方向移動的螞蟻在某個點相遇時,它們會同時改變移動方向並繼續移動。假設更改方向不會花費任何額外時間。

而當螞蟻在某一時刻 t 到達木板的一端時,它立即從木板上掉下來。

給你一個整數 n 和兩個整數數組 left 以及 right 。兩個數組分別標識向左或者向右移動的螞蟻在 t = 0 時的位置。請你返回最後一隻螞蟻從木板上掉下來的時刻。

輸入:n = 4, left = [4,3], right = [0,1]
輸出:4
解釋:如上圖所示:
-下標 0 處的螞蟻命名爲 A 並向右移動。
-下標 1 處的螞蟻命名爲 B 並向右移動。
-下標 3 處的螞蟻命名爲 C 並向左移動。
-下標 4 處的螞蟻命名爲 D 並向左移動。
請注意,螞蟻在木板上的最後時刻是 t = 4 秒,之後螞蟻立即從木板上掉下來。(也就是說在 t = 4.0000000001 時,木板上沒有螞蟻)。

提示:

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 中的所有值都是唯一的,並且每個值 只能出現在二者之一 中。

二、Solution

方法一:最遠的路程

思路

如果兩個螞蟻 a、b 相撞了(假設 a 向右,b 向左),如果不互換方向那麼螞蟻 b 就要走完 a 所走過的路,a 就要走完 b 所走過的路;如果互換方向,兩隻螞蟻要走的路也是一樣的…

所以,我們只需知道每個螞蟻離終點的最遠距離即可

class Solution {
public:
    int getLastMoment(int n, vector<int>& left, vector<int>& right) {
    	int ans = INT_MIN;
    	for (int i = 0; i < left.size(); i++)
    		ans = max(ans, left[i]);
    	for (int i = 0; i < right.size(); i++)
    		ans = max(ans, n-right[i]);
    	return ans;
    }
};

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章