1 minute read

Problem Statement

leetcode problem link

Brute Force approach [Accepted]

class Solution:
    def minSetSize(self, arr: List[int]) -> int:
        counter = Counter(arr)
        total_elems = len(arr)
        half = total_elems // 2
        curr_set = set()
        sorted_arr = sorted(list(counter.items()), key=lambda x: -x[1])

        for k, v in sorted_arr:
            if total_elems <= half:
                break
            curr_set.add(k)
            total_elems -= v

        return len(curr_set)

Approach 1: Sorting

def minSetSize(self, arr: List[int]) -> int:

    # Sort the input numbers.
    arr.sort()

    # Generate the counts array.
    counts = []
    current_run = 1
    for i in range(1, len(arr)):
        if arr[i] == arr[i - 1]:
            current_run += 1
            continue
        counts.append(current_run)
        current_run = 1
    counts.append(current_run)

    # Reverse sort the counts.
    counts.sort(reverse=True)

    # Remove numbers until at least half are removed.
    numbers_removed_from_arr = 0
    set_size = 0
    for count in counts:
        numbers_removed_from_arr += count
        set_size += 1
        if (numbers_removed_from_arr >= len(arr) // 2):
            break

    return set_size

Approach 2: Hashing/ Counting

def minSetSize(self, arr: List[int]) -> int:

    # In Python, we can use the built-in Counter class.
    counts = collections.Counter(arr)

    # Extract the counts in reverse-sorted order.
    # most_common gives (number, count) pairs, reverse sorted on count.
    counts = [count for number, count in counts.most_common()]

    # Remove numbers until at least half are removed.
    total_removed = 0
    set_size = 0
    for count in counts:
        total_removed += count
        set_size += 1
        if (total_removed >= len(arr) // 2):
            break

    return set_size