1. 程式人生 > >leetcode 911. 線上選舉(二分)

leetcode 911. 線上選舉(二分)

題目:

有N個人,每個人會在ti時間投per[i]一張票,給一個時間陣列tim[i],問在tim[i]的時候票最多的是誰,如果有相同的票數,最近獲得票的那個最多者是誰。

思路:

用vector儲存投票時間ti,和投票時的票最多的人。

然後在時間數列中,對於每一個tim[i],都在vector中二分查詢第一個大於tim[i]時間的那個位置即可。然後這個位置之前的那個位置就是我們需要得到的位置,那個位置時候的票數最多的人已經記錄在vector中。

程式碼:

class TopVotedCandidate {
public:

struct MY{
    int per,vote,num;
    MY(){}
    MY(int a,int b,int c):per(a),vote(b),num(c){}
    bool operator<(const MY m)const{
        if(vote==m.vote)return num<m.num;
        else return vote<m.vote;
    }
};

struct TIM{
    int ti,per;
    TIM(){}
    TIM(int a,int b):ti(a),per(b){}
    bool operator<(const TIM t)const{
        return ti<t.ti;
    }
};


map<int,int>ma;
priority_queue<MY>p;
vector<TIM>ve;
int ji = 0;
TopVotedCandidate(vector<int> persons, vector<int> times) {
    ji = 0;
    ve.clear();
    ma.clear();
    while(!p.empty())p.pop();
    int sz = persons.size();
    for(int i=0;i<sz;i++){
        ma[persons[i]]++;
        p.push(MY(persons[i],ma[persons[i]],ji++));
        MY m = p.top();
        ve.push_back(TIM(times[i],m.per));
    }
    sz = ve.size();
    sort(ve.begin(),ve.end());
}

int q(int t) {
    int aa = upper_bound(ve.begin(),ve.end(),TIM(t,0)) - ve.begin();
    if(aa==0)return NULL;
    return ve[aa-1].per;
}

};

/**
 * Your TopVotedCandidate object will be instantiated and called as such:
 * TopVotedCandidate obj = new TopVotedCandidate(persons, times);
 * int param_1 = obj.q(t);
 */

總結:我做了多餘的操作就是用優先佇列把人,次數,和出現位置存了起來,其實可以直接遍歷的。