2332. The Latest Time to Catch a Bus

T: O((m+n) + mlogm + nlogn)
S: O(1)
```java
class Solution {
    public int latestTimeCatchTheBus(int[] buses, int[] passengers, int capacity) {
        Arrays.sort(buses);
        Arrays.sort(passengers);
        
        int m = buses.length;
        int n = passengers.length;
        int j = 0;
        int result = 0;

        for (int i = 0; i < m; i++) {
            int cap = capacity;
            while (j < n && passengers[j] <= buses[i] && cap > 0) { // 狀況1: 車子會滿
                if (j == 0 || j >= 1 && passengers[j-1] != passengers[j]-1 ) { // p[0](j是第一位乘客), 那一定可以擠他前面 passengers[i] >=2, 1可以擠
                // 其他就是檢驗 目前乘客的前一個時間, 是不是可以擠上去 (不行也不用更新啦...)
                    result = passengers[j]-1;
                }
                cap--;
                j++;
            }
            if (cap > 0) { // 狀況2: 這班車沒滿, 所以如果發車時間 buses[i] 沒有乘客, 那就可以佔位
                if (j == 0 || j >= 1 && passengers[j-1] != buses[i] ) { 
                    // 一樣確定有沒有佔位(buses[i]發車的時間, p[j-1]是不是佔位); 另一種狀況 p[0](如果j是第一位乘客) 無論如何都是ok的
                    // 另一種狀況 p[0](如果j是第一位乘客) -> 只會發生在這班車完全沒乘客, 所以 j還在0
                    result = buses[i];
                }
            }
        }
        return result; // 所以其實 case 1, case2 我們都考慮去更新, 因為 case2能更新的話一定比較大, 所以兩者都判斷且更新是沒問題的
    }
}

/***
T: O((m+n) + mlogm + nlogn)
S: O(1)

sort 後
雙指針 
看bus 時間
看passager 時間

2 cases:
1. cap is full... so we try to find , is there a empty before passager

if all passenger can go to the bus, cap > 0
2. just take bus time (bus[i]) is the latest

          10            20
2.              17 18 19

           x  x      

          10            20
 1            11           
 */
```

Last updated