欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[二分法]leetcode1157:子数组中占绝大多数的元素(hard)

程序员文章站 2024-03-15 22:56:48
...

题目:
[二分法]leetcode1157:子数组中占绝大多数的元素(hard)
题解:

  • 二分法
  • 使用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;
    }
};