所以,我在 Geeks For Geeks 上遇到了这个问题。 问题链接
问题: 给定一个大小为
arr
的数组 N
和一个元素 k
。任务是找到数组中出现超过 n/k
次的元素的数量。
示例1: 输入:
N = 8
arr = [3,1,2,2,1,2,3,3]
k = 4
输出:
2
说明: 在给定的数组中,
3
和2
是唯一出现超过n/k
次的元素。
我通过添加其中每个元素的计数来接近
Map
。 arr[]
中的值充当 Key
的 Map
。该 Key
在 arr[]
中出现的次数存储在 Map
的相应值中。但是,我必须首先用 Map
初始化 0
中的值,然后运行另一个循环来计算值。
map<int, int> m;
for (int i = 0; i < n; ++i)
{
m[arr[i]] = 0;
}
for (int i = 0; i < n; ++i)
{
m[arr[i]] += 1;
}
有没有更好或更有效的方法来做同样的事情。也许在同一个循环中?
我的完整解决方案(所有案例都通过了,只是寻找一个有效的方法):
//{ Driver Code Starts
// A C++ program to print elements with count more than n/k
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
// } Driver Code Ends
class Solution
{
public:
// Function to find all elements in array that appear more than n/k times.
int countOccurence(int arr[], int n, int k)
{
// Your code here
int x = n / k, count = 0;
map<int, int> m;
for (int i = 0; i < n; ++i)
{
m[arr[i]] = 0;
}
for (int i = 0; i < n; ++i)
{
m[arr[i]] += 1;
}
map<int, int>::iterator it = m.begin();
while (it != m.end())
{
if ((it->second) > x)
count += 1;
}
return count;
}
};
//{ Driver Code Starts.
int main()
{
int t;
cin >> t;
while (t--)
{
int n, i;
cin >> n;
int arr[n];
for (i = 0; i < n; i++)
cin >> arr[i];
int k;
cin >> k;
Solution obj;
cout << obj.countOccurence(arr, n, k) << endl;
}
return 0;
}
// } Driver Code Ends
当您使用映射的
operator[]
来索引元素时,如果键尚未在映射中,它会默认初始化该元素。 int
的默认初始化为 0,因此您的第一个循环是多余的。您只需将其删除即可。
map<int, int> m;
for (int i = 0; i < n; ++i)
{
m[arr[i]] += 1;
}