在C++中用0初始化地图的有效方法

问题描述 投票:0回答:1

所以,我在 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
c++
1个回答
0
投票

当您使用映射的

operator[]
来索引元素时,如果键尚未在映射中,它会默认初始化该元素。
int
的默认初始化为 0,因此您的第一个循环是多余的。您只需将其删除即可。

map<int, int> m;
for (int i = 0; i < n; ++i)
{
     m[arr[i]] += 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.