📜  计算链表中的最小频率元素

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

给定一个包含重复元素的链表。任务是找到给定链表中所有最小出现元素的计数。这是矩阵中频率最小的所有此类元素的计数。
例子

Input : 1-> 2-> 2-> 3
Output : 2
Explanation:
1 and 3 are elements occurs only one time.
So, count is 2.

Input : 10-> 20-> 20-> 10-> 30
Output : 1

方法

  • 遍历链表,使用哈希表存储链表元素出现的频率,使得map的key是链表元素,value是它在链表中的频率。
  • 然后遍历哈希表,找到最小频率。
  • 最后,遍历hash表,找出元素出现的频率,并检查是否与上一步得到的最小频率匹配,如果匹配,则将该频率加入计数。

下面是上述方法的实现:

C++
// C++ program to find count of minimum
// frequqncy elements in Linked list
#include 
using namespace std;
 
/* Link list node */
struct Node {
    int key;
    struct Node* next;
};
 
/* Given a reference (pointer to pointer) to the head
of a list and an int, push a new node on the front
of the list. */
void push(struct Node** head_ref, int new_key)
{
    struct Node* new_node = new Node;
    new_node->key = new_key;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
 
// Function to count minimum frequency elements
// in the linked list
int countMinimum(struct Node* head)
{
    // Store frequencies of all nodes.
    unordered_map mp;
    struct Node* current = head;
    while (current != NULL) {
        int data = current->key;
        mp[data]++;
        current = current->next;
    }
 
    // Find min frequency
    current = head;
    int min_frequency = INT_MAX, countMin = 0;
    for (auto it = mp.begin(); it != mp.end(); it++) {
        if (it->second <= min_frequency) {
            min_frequency = it->second;
        }
    }
 
    // Find count of min frequency elements
    for (auto it = mp.begin(); it != mp.end(); it++) {
        if (it->second == min_frequency) {
            countMin += (it->second);
        }
    }
 
    return countMin;
}
 
/* Driver program to test count function*/
int main()
{
    /* Start with the empty list */
    struct Node* head = NULL;
    int x = 21;
 
    /* Use push() to construct below list
    10->10->11->30->10 */
    push(&head, 10);
    push(&head, 30);
    push(&head, 11);
    push(&head, 10);
    push(&head, 10);
 
    cout << countMinimum(head) << endl;
    return 0;
}


Java
// Java program to find count of minimum
// frequqncy elements in Linked list
import java.util.*;
 
class GFG
{
 
/* Link list node */
static class Node {
    int key;
    Node next;
};
 
/* Given a reference (pointer to pointer) to the head
of a list and an int, push a new node on the front
of the list. */
static Node push(Node head_ref, int new_key)
{
    Node new_node = new Node();
    new_node.key = new_key;
    new_node.next = (head_ref);
    (head_ref) = new_node;
    return head_ref;
}
 
// Function to count minimum frequency elements
// in the linked list
static int countMinimum( Node head)
{
    // Store frequencies of all nodes.
    HashMap mp = new HashMap();
    Node current = head;
    while (current != null)
    {
        int data = current.key;
        mp.put(data, (mp.get(data) == null ? 1:mp.get(data) + 1));
        current = current.next;
    }
 
    // Find min frequency
    current = head;
    int min_frequency = Integer.MAX_VALUE, countMin = 0;
    for (Map.Entry it :mp.entrySet())
    {
        if (it.getValue() <= min_frequency)
        {
            min_frequency = it.getValue();
        }
    }
 
    // Find count of min frequency elements
    for (Map.Entry it :mp.entrySet())
    {
        if (it.getValue() == min_frequency)
        {
            countMin += (it.getValue());
        }
    }
 
    return countMin;
}
 
/* Driver code*/
public static void main(String args[])
{
    /* Start with the empty list */
    Node head = null;
    int x = 21;
 
    /* Use push() to construct below list
    10.10.11.30.10 */
    head = push(head, 10);
    head = push(head, 30);
    head = push(head, 11);
    head = push(head, 10);
    head = push(head, 10);
 
    System.out.println( countMinimum(head) );
}
}
 
// This code is contributed by andrew1234


Python3
# Python3 program to find count of minimum
# frequqncy elements in Linked list
import sys
import math
 
# Link list node
class Node:
    def __init__(self,data):
        self.data = data
        self.next = None
 
# Given a reference (pointer to pointer) to the head
# of a list and an int, push a new node on the front
# of the list.
def push(head,data):
    if not head:
        return Node(data)
    temp = Node(data)
    temp.next = head
    head = temp
    return head
 
# Function to count minimum frequency elements
# in the linked list
def countMinimun(head):
     
    # Store frequencies of all nodes.
    freq = {}
    temp = head
    while(temp):
        d = temp.data
        if d in freq:
            freq[d] = freq.get(d) + 1
        else:
            freq[d] = 1
        temp = temp.next
     
    # Find min frequency
    minimum_freq = sys.maxsize
    for i in freq:
        minimum_freq = min(minimum_freq, freq.get(i))
     
    # Find count of min frequency elements
    countMin = 0
    for i in freq:
        if freq.get(i) == minimum_freq:
            countMin += 1
    return countMin
 
# Driver program to test count function #
if __name__=='__main__':
 
    # Start with the empty list
    head = None
     
    # Use push() to construct below list
    #10->10->11->30->10
    head = push(head,10)
    head = push(head,30)
    head = push(head,11)
    head = push(head,10)
    head = push(head,10)
 
    print(countMinimun(head))
 
# This code is Contribute by Vikash Kumar 37


C#
// C# program to find count of minimum
// frequqncy elements in Linked list
using System;
using System.Collections.Generic;
 
class GFG
{
 
/* Link list node */
public class Node {
    public int key;
    public Node next;
};
 
/* Given a reference (pointer to pointer) to the head
of a list and an int, push a new node on the front
of the list. */
static Node push(Node head_ref, int new_key)
{
    Node new_node = new Node();
    new_node.key = new_key;
    new_node.next = (head_ref);
    head_ref = new_node;
    return head_ref;
}
 
// Function to count minimum frequency elements
// in the linked list
static int countMinimum( Node head)
{
    // Store frequencies of all nodes.
    IDictionary mp = new Dictionary();
     
    Node current = head;
    while (current != null)
    {
        int data = current.key;
        int val = 0;
        mp[data] = (!mp.TryGetValue(data,out val)  ? 1:mp[data]+ 1);
        current = current.next;
    }
 
    // Find min frequency
    current = head;
    int min_frequency = int.MaxValue, countMin = 0;
    foreach (KeyValuePair it in mp)
    {
        if (it.Value <= min_frequency)
        {
            min_frequency = it.Value;
        }
    }
 
    // Find count of min frequency elements
    foreach (KeyValuePair it in mp)
    {
        if (it.Value == min_frequency)
        {
            countMin += (it.Value);
        }
    }
 
    return countMin;
}
 
/* Driver code*/
public static void Main()
{
    /* Start with the empty list */
    Node head = null;
    int x = 21;
 
    /* Use push() to construct below list
    10.10.11.30.10 */
    head = push(head, 10);
    head = push(head, 30);
    head = push(head, 11);
    head = push(head, 10);
    head = push(head, 10);
 
    Console.WriteLine( countMinimum(head) );
}
}
 
// This code is contributed by SoumikMondal


Javascript


输出:

2

时间复杂度: O(n)

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