leetcode 911. 線上選舉(二分)
阿新 • • 發佈:2018-11-21
題目:
有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); */
總結:我做了多餘的操作就是用優先佇列把人,次數,和出現位置存了起來,其實可以直接遍歷的。