Now only code is provided, no explanation is given temporarily.
題意
給定一個陣列 time,其中 time[i] 表示第 i 輛公車完成 一次旅程 所需的時間。
每輛公車可以 連續 完成多趟旅程,也就是說,一輛公車當前旅程完成後,可以 立即開始 下一趟旅程。每輛公車 獨立 運行,也就是說可以同時有多輛公車在運行且互不影響。
給定一個整數 totalTrips,表示所有公車總共應完成的旅程數。返回完成 至少 totalTrips 旅程所需的 最少 時間。
約束條件
- 1≤time.length≤105
- 1≤time[i],totalTrips≤107
思路:二分搜尋(Binary Search)
<++>
複雜度分析
<++>
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution: def minimumTime(self, time: List[int], totalTrips: int) -> int: def check(t): return sum(t//x for x in time) >= totalTrips
left, right = 1, min(time) * totalTrips while left <= right: mid = (left + right) // 2 if check(mid): right = mid - 1 else: left = mid + 1 return left
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: long long minimumTime(vector<int>& time, int totalTrips) { function<bool(long long)> check = [&](long long t) -> bool { long long sum = 0; for (int x : time) { sum += t / x; } return sum >= totalTrips; }; long long left = 1; long long right = (long long) *min_element(time.begin(), time.end()) * totalTrips; while (left <= right) { long long mid = (left + right) / 2; if (check(mid)) { right = mid - 1; } else { left = mid + 1; } } return left; } };
|
寫在最後
Cover photo is remixed from @吃肥皂泡泡, thanks for their work!