LeetCode 1057. Campus Bikes


直接根據最短distance greedy做。

用了優先隊列,C++ less<type> 是大的先,所以我們可以重載<符號,把邏輯反過來。

class Solution {
public:
    struct dist_pair{
        int dist;
        int worker;
        int bike;
        bool operator<(const dist_pair &a) const {
            if (dist!=a.dist) return dist>a.dist;
            else if (worker!=a.worker) return worker>a.worker;
            return bike>a.bike;
        }
    };
    
    vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
        priority_queue<dist_pair> q;
        for (int i=0;i<workers.size();++i){
            for (int j=0;j<bikes.size();++j){
                int d = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
                q.push({d,i,j});    
            }
        }
        
        vector<int> assign(workers.size(),-1);
        vector<bool> visitedBike(bikes.size(),false);
        while (!q.empty()){
            auto [d,i,j] = q.top(); q.pop();
            if(assign[i]==-1 && visitedBike[j]==false){
                visitedBike[j] = true;
                assign[i] = j;
            }   
        }
        return assign;
    }
};

 

第二種寫法不用結構體,節省了空間復雜度,但是每次cmp的時候都要計算dist,但是時間會翻倍。

這里采用了 lambda funtion,注意 priority_queue 里 lambda 的寫法。

class Solution {
public:
    vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
        auto cmp=[&](const pair<int,int> &a, const pair<int,int> &b){
            int dist_a=dist(a.first,a.second,workers,bikes);
            int dist_b=dist(b.first,b.second,workers,bikes);
            if (dist_a!=dist_b) return dist_a>dist_b;
            if (a.first!=b.first) return a.first>b.first;
            return a.second>b.second;
        };
        priority_queue<pair<int,int>,vector<pair<int,int>>,decltype(cmp)> q(cmp);
        
        for (int i=0;i<workers.size();++i)
            for (int j=0;j<bikes.size();++j)
                q.push({i,j});
        
        vector<int> assign(workers.size(),-1);
        vector<bool> visitedBike(bikes.size(),false);
        while (!q.empty()){
            auto [i,j] = q.top(); q.pop();
            if(assign[i]==-1 && visitedBike[j]==false){
                visitedBike[j] = true;
                assign[i] = j;
            }
        }
        return assign;
    }
    
    int dist(int i, int j, vector<vector<int>>& workers, vector<vector<int>>& bikes){
        return abs(workers[i][0]-bikes[j][0])+abs(workers[i][1]-bikes[j][1]);
    }
};

時間復雜度:mnlog(mn),因為有mn對pair。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM