陣列列表中的最大距離
給定 m 個陣列,每個陣列都已經按照升序排好序了。現在你需要從兩個不同的陣列中選擇兩個整數(每個陣列選一個)並且計算它們的距離。兩個整數 a 和 b 之間的距離定義為它們差的絕對值 |a-b| 。你的任務就是去找到最大距離
目標
題意中的絕對值 |a-b|等價於選取兩個陣列的最大、最小值相減;由於每個陣列已經排序,進一步等價於\(\max(vec[i][n-1] - vec[j][0], vec[j][m-1] - vec[i][0])\)。
直觀想法
找 \(\min(vec[i][0])\)和\(\max(vec[i][n-1])\),但是還需要保障這兩個數不在同一個陣列中,由此產生思路:
- 依照 vec[i][0] 的值從小到大進行排序(不直接排序原陣列,而是新申請 index 陣列進行排序),得到 \(index_1\)
- 依照 vec[i][n-1] 的值從大到小進行排序 (不直接排序原陣列,而是新申請 index 陣列進行排序),得到 \(index_2\)
- 比較兩個 index 陣列的第一個值是否相等,不相等則說明不是同一個陣列,可直接計算得出結果;相等則還需要拿出兩個index陣列的第二個值進行計算比較得出結果
最優解思路
1. 僅僅兩個陣列a, b
很好解決——選擇 \(a_{max} - b_{min}\) 和 \(b_{max} - a_{min}\) 的最大值
2. 三個陣列 a, b, c
透過步驟1,可以得到一個潛在結果 ans;對於 c 的加入,選擇 $ \max(a_{max}, b_{max}) - c_{min}$ 和 $c_{max} - \min(a_{min}, b_{min}) $ 的最大值
3. 進一步範化
已知 m-1 個陣列的答案,而且知道真個陣列的最大、最小值,先加入一個新的陣列,計算得到答案。由此可以得到時間複雜度為\(O(n)\),空間複雜度為\(O(1)\)的方法