[二分法]leetcode1157:子数组中占绝大多数的元素(hard)
程序员文章站
2024-03-15 22:56:48
...
题目:
题解:
- 二分法
- 使用map来存放<元素值,等于该元素值的所有下标>,调用query()时,我们需要遍历map使用二分法来获得[left,right]内的元素个数,若元素个数大于等于thresshold,则我们直接返回该元素值;否则我们继续遍历map,直到遍历完成都没找到合适的值,则返回-1。
代码如下:
class MajorityChecker {
private:
map<int,vector<int>> m;//<元素,等于该元素值下标>
public:
MajorityChecker(vector<int>& arr) {
for(int i=0;i<arr.size();++i){
m[arr[i]].push_back(i);
}
}
int query(int left, int right, int threshold) {
for(auto &it:m){
if(it.second.size()<threshold)continue;
//使用二分来查找[left,right]范围内的元素个数,若大于等于threshold则直接返回该元素,否则进行下一次遍历
auto a=lower_bound(begin(it.second),end(it.second),left);
auto b=upper_bound(begin(it.second),end(it.second),right);
if(b-a>=threshold)return it.first;
}
return -1;
}
};