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

Ссылка на задачу – 2364. Count Number of Bad Pairs.

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

Дан массив nums, где пара индексов (i, j) называется плохой, если выполняется:

Требуется найти общее количество таких плохих пар.

💡 Идея

🛠️ Детали метода

  1. Создаём массив позиционных разностей:
    pos_diff[i]=nums[i]−i
  2. Сортируем массив pos_diff, группируя одинаковые значения.
  3. Используем метод chunk_by для подсчёта частот одинаковых значений.
  4. Для каждой такой частоты count, вычисляем количество хороших пар:
    count×(count−1)/2
  5. Всего существует n × (n - 1) / 2 пар, из них вычитаем хорошие пары и получаем ответ.

⏳ Асимптотика

🔥 Хотя сортировка для подсчёта частот медленнее хеш-таблиц в асимптотике, на практике она быстрее из-за низкой константы!

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

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

        // Compute adjusted values (nums[i] - i) and sort
        let mut pos_diff: Vec<_> = nums.into_iter()
            .enumerate()
            .map(|(idx, num)| num - idx as i32)
            .collect();

        pos_diff.sort_unstable();

        // Count good pairs using `chunk_by`
        let good_pairs: i64 = pos_diff
            .chunk_by(|a, b| a == b)
            .map(|chunk| (chunk.len() as i64 * (chunk.len() as i64 - 1)) / 2)
            .sum();

        // Total pairs - good pairs = bad pairs
        let total_pairs = n * (n - 1) / 2;
        total_pairs - good_pairs
    }
}

Tags: #rust #algorithms #math