📌  相关文章
📜  数组中所有最小出现元素的总和

📅  最后修改于: 2021-10-27 07:45:13             🧑  作者: Mango

给定一个包含重复元素的整数数组。任务是找到给定数组中所有出现次数最少的元素的总和。那是数组中频率最小的所有此类元素的总和。
例子

Input : arr[] = {1, 1, 2, 2, 3, 3, 3, 3}
Output : 2
The least occurring element is 1 and 2 and it's number
of occurrence is 2. Therefore sum of all 1's and 2's in the 
array = 1+1+2+2 = 6.

Input : arr[] = {10, 20, 30, 40, 40}
Output : 60
Elements with least frequency are 10, 20, 30.
Their sum = 10 + 20 + 30 = 60.

方法

  • 遍历数组并使用C++中的unordered_map来存储数组元素的频率,这样map的key就是数组元素,value就是它在数组中的频率。
  • 然后,遍历地图以找到最小出现元素的频率。
  • 现在,要找到总和,再次遍历地图,并为所有具有最小频率的元素找到frequency_of_min_occurring_element*min_occurring_element并找到它们的总和。

下面是上述方法的实现:

C++
// C++ program to find the sum of all minimum
// occurring elements in an array
 
#include 
using namespace std;
 
// Function to find the sum of all minimum
// occurring elements in an array
int findSum(int arr[], int N)
{
    // Store frequencies of elements
    // of the array
    unordered_map mp;
    for (int i = 0; i < N; i++)
        mp[arr[i]]++;   
 
    // Find the min frequency
    int minFreq = INT_MAX;
    for (auto itr = mp.begin(); itr != mp.end(); itr++) {
        if (itr->second < minFreq) {
            minFreq = itr->second;
        }
    }
 
    // Traverse the map again and find the sum
    int sum = 0;
    for (auto itr = mp.begin(); itr != mp.end(); itr++) {
        if (itr->second == minFreq) {
            sum += itr->first * itr->second;
        }
    }
 
    return sum;
}
 
// Driver Code
int main()
{
    int arr[] = { 10, 20, 30, 40, 40 };
 
    int N = sizeof(arr) / sizeof(arr[0]);
 
    cout << findSum(arr, N);
 
    return 0;
}


Java
// Java program to find the sum of all minimum
// occurring elements in an array
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
 
class GFG
{
// Function to find the sum of all minimum
// occurring elements in an array
static int findSum(int arr[], int N)
{
    // Store frequencies of elements
    // of the array
    Map mp = new HashMap<>();
    for (int i = 0; i < N; i++)
        mp.put(arr[i],mp.get(arr[i])==null?1:mp.get(arr[i])+1);
 
 
    // Find the min frequency
    int minFreq = Integer.MAX_VALUE;
    minFreq = Collections.min(mp.entrySet(),
            Comparator.comparingInt(Map.Entry::getKey)).getValue();
 
 
    // Traverse the map again and find the sum
    int sum = 0;
    for (Map.Entry entry : mp.entrySet())
    {
        if (entry.getValue() == minFreq)
        {
            sum += entry.getKey() * entry.getValue();
        }
    }
 
    return sum;
}
 
// Driver Code
public static void main(String[] args)
{
    int arr[] = { 10, 20, 30, 40, 40 };
 
    int N = arr.length;
 
    System.out.println( findSum(arr, N));
}
}
 
// This code contributed by Rajput-Ji


Python3
# Python3 program to find theSum of all
# minimum occurring elements in an array
import math as mt
 
# Function to find theSum of all minimum
# occurring elements in an array
def findSum(arr, N):
 
    # Store frequencies of elements
    # of the array
    mp = dict()
    for i in arr:
        if i in mp.keys():
            mp[i] += 1
        else:
            mp[i] = 1
 
    # Find the min frequency
    minFreq = 10**9
    for itr in mp:
        if mp[itr]< minFreq:
            minFreq = mp[itr]
         
    # Traverse the map again and
    # find theSum
    Sum = 0
    for itr in mp:
        if mp[itr]== minFreq:
            Sum += itr * mp[itr]
         
    return Sum
 
# Driver Code
arr = [ 10, 20, 30, 40, 40]
 
N = len(arr)
 
print(findSum(arr, N))
 
# This code is contributed by
# mohit kumar 29


C#
// C# program to find the sum of all minimum
// occurring elements in an array
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to find the sum of all minimum
// occurring elements in an array
static int findSum(int[] arr, int N)
{
     
    // Store frequencies of elements
    // of the array
    Dictionary mp = new Dictionary(); 
    for(int i = 0; i < N; i++)
    {
        if (mp.ContainsKey(arr[i]))
        {
            mp[arr[i]]++;
        }
        else
        {
            mp.Add(arr[i], 1);
        }
    }
   
    // Find the min frequency
    int minFreq = Int32.MaxValue;
    foreach(KeyValuePair itr in mp)
    {
        if (itr.Value < minFreq)
        {
            minFreq = itr.Value;
        }
    }
    
    // Traverse the map again and find the sum
    int sum = 0;
    foreach(KeyValuePair itr in mp)
    {
        if (itr.Value == minFreq)
        {
            sum += itr.Key * itr.Value;
        }
    }
    return sum;
}
 
// Driver code
static void Main()
{
    int[] arr = { 10, 20, 30, 40, 40 };
 
    int N = arr.Length;
   
    Console.Write(findSum(arr, N));
}
}
 
// This code is contributed by divyeshrabadiya07


Javascript


输出:
60

时间复杂度:O(N),其中 N 是数组中元素的数量。

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程