Leetcode 1157. 子数组中占绝大多数的元素(149周赛)

实现一个 MajorityChecker 的类,它应该具有下述几个 API:

MajorityChecker(int[] arr) 会用给定的数组 arr 来构造一个 MajorityChecker 的实例。
int query(int left, int right, int threshold) 有这么几个参数:
0 <= left <= right < arr.length 表示数组 arr 的子数组的长度。
2 * threshold > right - left + 1,也就是说阀值 threshold 始终比子序列长度的一半还要大。
每次查询 query(...) 会返回在 arr[left], arr[left+1], ..., arr[right] 中至少出现阀值次数 threshold 的元素,如果不存在这样的元素,就返回 -1。

示例:

MajorityChecker majorityChecker = new MajorityChecker([1,1,2,2,1,1]);
majorityChecker.query(0,5,4); // 返回 1
majorityChecker.query(0,3,3); // 返回 -1
majorityChecker.query(2,3,2); // 返回 2
 

提示:

1 <= arr.length <= 20000
1 <= arr[i] <= 20000
对于每次查询,0 <= left <= right < len(arr)
对于每次查询,2 * threshold > right - left + 1
查询次数最多为 10000

对在范围内出现的进行计数,当其大于等于threshold时,返回值,遍历后仍未返回,说明不存在数量大于阈值的数,返回-1;

class MajorityChecker {
public:
	int data[200001] = { 0 };
    int biao[200001] = {0};
	MajorityChecker(vector<int>& arr) {
		for (int i = 0; i < arr.size(); i++)
		{
			data[i] = arr[i];
			
		}
	}
	int query(int left, int right, int threshold) {
        memset(biao, 0, sizeof(biao));
		for (int i = left; i <= right; i++)
		{
			biao[data[i]] += 1;
            if(biao[data[i]] >= threshold)
                    return data[i];
		}
        return -1;
	}
};
发布了104 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Yanpr919/article/details/99201948