853. Car Fleet

思路
把车按离终点的距离从远到近排列。
车队的到达时间取决于排在最前面的那辆车。
从远到近遍历车辆,如果上一辆车到达终点的时间比这一辆车快,就合并把上一辆车合并到当前车队里。然后把当前车队放入栈。
最后,栈里面的元素数量就是车队数量。
代码

class Solution {
public:
    int carFleet(int target, vector& position, vector& speed) {
        int n = position.size();
        vector< pair > v;
        stack< pair > st;
        
        for (int i = 0; i < n; i++) {
            v.push_back({position[i], speed[i]});
        }
        
        sort(v.begin(), v.end(), [](pair p1, pair p2){return p1.first <= p2.first;});
        
        for (int i = 0; i < n; i++) {
            int pos = v[i].first;
            int sp = v[i].second;
            
            while (!st.empty()) {
                long d1 = target - st.top().first;
                long d2 = target - pos;
                long v1 = st.top().second;
                long v2 = sp;
                
                if (d1 * v2 <= d2 * v1) { // (d1 / v1) <= (d2 / v2)得出
                    st.pop();
                }
                else {
                    break;
                }
            }
            st.push({pos, sp});
        }
        
        int res = 0;
        while (!st.empty()) {
            st.pop();
            res++;
        }
        
        return res;
    }
};

你可能感兴趣的:(853. Car Fleet)