[二分法]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;
    }
};
发布了512 篇原创文章 · 获赞 175 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/104077493