главная новое лучшее написать
3

Ссылка на задачу – 1726. Tuple with Same Product.

📜 Описание задачи

Дан массив nums из различных положительных чисел. Нужно вернуть количество кортежей (a, b, c, d), таких что произведение a * b равно произведению c * d, при условии, что все элементы кортежа различны.

💡 Идея

🔍 Детали подхода

  1. Подсчет в HashMap:
    • Используем два вложенных цикла для перебора всех уникальных пар (i, j) с условием i < j и вычисляем их произведение.
    • Результаты произведений сохраняем в HashMap, где ключ — это само произведение, а значение — количество его вхождений.
  2. Расчет кортежей:
    • Для каждого произведения с частотой больше 1, добавляем в итоговый результат значение
      4 * frequency * (frequency - 1).
  3. Возврат результата:
    • Итоговый результат суммируется и возвращается.

⏱️ Асимптотика

💻 Исходный код

use std::collections::HashMap;

impl Solution {
    pub fn tuple_same_product(nums: Vec<i32>) -> i32 {
        let n = nums.len();

        // Map to store the count of each product computed from unique pairs.
        let mut product_count: HashMap<i32, i32> = HashMap::new();
        // Iterate over all unique pairs (i, j) with i < j.
        for i in 0..n {
            for j in i + 1..n {
                let product = nums[i] * nums[j];
                // Increment the count for the computed product.
                *product_count.entry(product).or_insert(0) += 1;
            }
        }

        // Sum the contributions for each product (only counts > 1 contribute).
        // Each product contributes count * (count - 1)/2 tuple pairs, then multiplied by 8.
        4 * product_count.values().map(|cnt| cnt * (cnt - 1)).sum::<i32>()
    }
}

Tags: #rust #algorithms #frequencies

2 leetcoder 06-02-2025

На практических масштабах решение со сложностью O(N²logN) (сложить все произведения в вектор, который потом отсортировать и посчитать частоты по нему) работает немного (на 20%) быстрее.
Хороший пример, когда константа от хэш-таблицы даёт больший вклад, чем логарифм от сортировки!

impl Solution {
    pub fn tuple_same_product(nums: Vec<i32>) -> i32 {
        // Build vector of products for all unique pairs.
        let mut products: Vec<_> = (1..nums.len())
            .flat_map(|j| (0..j).map(|i| nums[i] * nums[j]).collect::<Vec<_>>())
            .collect();

        // Sort to group identical products.
        products.sort_unstable();

        // Group products, calculate frequency-based contributions, and sum them.
        4 * products.chunk_by(|a, b| a == b)
            .filter_map(|group| if group.len() > 1 {Some(group.len() as i32)} else {None})
            .map(|freq| freq * (freq - 1))
            .sum::<i32>()
    }
}
ответить