题目背景:
以下解法超出时间限制,重点是学习思路。
用leetcode官方解法:预处理+二分查找的方式
//预处理 + 二分查找的方式
class TopVoteCandidate
{
public:
vector<int>data;//该数组用于保存票数最多的候选人
vector<int>index;//时间数组
TopVoteCandidate(vector<int>& persons, vector<int>& times)
{
vector<int>countvec(persons.size() + 1, 0);//统计票数
//初始化数组大小
data.resize(persons.size(), 0);
index.resize(persons.size(), 0);
int cur = 0, curval = 0;//cur用于保存当前最大投票数目 ;curval用于保存当前最大投票数目候选人的编号;
for (int i = 0; i < persons.size(); i++)
{
index[i] = times[i];//index[i]保存多个时间节点
countvec[persons[i]]++;//票数加一
if (countvec[persons[i]] >= cur)
{
cur = countvec[persons[i]];//更新最大的票数
data[i] = persons[i];//更新编号
curval = persons[i];
}
else
{
data[i] = curval;
}
}
}
//**二分查找的过程 :查找范围是所有的时间节点所在的时间数组;**
//想要找的是 t时刻
int q(int t)
{
int left = 0, right = index.size();
while (left < right)
{
int mid = left + (right - left) / 2;
if (index[mid] > t)
{
right = mid;
}
else
{
left = mid - 1;
}
}
return data[left - 1];//返回时刻t对应的候选人编号
}
};