Рубрики
Без рубрики

День 18 – Максимальное количество пар Sum

Вам предоставляется целочисленные массивные номера и целое число k. В одной операции вы можете выбрать два номера. Теги с лецкодом, Python, Challenge.

Вам дают целочисленный массив Nums и целое число k .

В одной операции вы можете выбрать два числа из массива, сумма которой равен k и удалить их из массива.

Вернуть максимальное количество операций, которые вы можете выполнить на массиве.

Пример 1:

Input: nums = [1,2,3,4], k = 5
Output: 2
Explanation: Starting with nums = [1,2,3,4]:
- Remove numbers 1 and 4, then nums = [2,3]
- Remove numbers 2 and 3, then nums = []
There are no more pairs that sum up to 5, hence a total of 2 operations.

Пример 2:

Input: nums = [3,1,3,4,3], k = 6
Output: 1
Explanation: Starting with nums = [3,1,3,4,3]:
- Remove the first two 3's, then nums = [1,4,3]
There are no more pairs that sum up to 6, hence a total of 1 operation.

Ограничения:

  • 1 длиной
  • 1 [я]
  • 1

Тесты

Ссылка на код

import pytest
from .Day18_MaxNumberOfKSumPairs import Solution

s = Solution()


@pytest.mark.parametrize(
    "nums,k,expected",
    [
        ([1, 2, 3, 4], 5, 2),
        ([3, 1, 3, 4, 3], 6, 1),
        ([3, 5, 1, 5], 2, 0),
        ([4, 4, 1, 3, 1, 3, 2, 2, 5, 5, 1, 5, 2, 1, 2, 3, 5, 4], 2, 2),
    ],
)
def test_max_operations(nums, k, expected):
    assert s.maxOperations(nums, k) == expected

Решение

Ссылка на код

from typing import List
import math


class Solution:
    def maxOperations(self, nums: List[int], k: int) -> int:
        max_ops = 0
        counts = {}
        for n in nums:
            if n in counts:
                counts[n] = counts[n] + 1
            else:
                counts[n] = 1

        for n in counts:
            diff = k - n
            if diff in counts and counts[diff] > 0:
                ops = 0
                if n == k // 2:
                    ops = math.floor(counts[n] // 2)
                else:
                    ops = min(counts[n], counts[diff])

                max_ops += ops
                counts[diff] = counts[diff] - ops
                counts[n] = counts[n] - ops

        return max_ops

Анализ

Комментарий

Довольно легкий и быстрый сегодня. Я мог бы определенно улучшить это, но это сделает.

Во время выполнения есть На) . Мы получили список один раз, чтобы вставить на карту. Затем мы проходим на карте ключи и сделаем наши расчеты. Пространство это На) Потому что мы создали карту для хранения отсчетов.

Использование карты дает нам очень быстрый способ посмотреть k - n для каждого n . Если мы найдем матч, мы можем уменьшить количество подсчетов для каждого номера в матче Мин (счетчики [n], считает [diff]) и увеличивайте максимальные операции этим номером.

Другим дел нам нужно думать о том, где k - n является K/2 Отказ Это сломает нашу реализацию, поэтому нам нужно добавить чек на этот случай и использовать math.floor (счетчики [n]//2) Отказ Например, возьмите к и [1, 1, 1, 1] Отказ Если мы использовали Мин (счетчики [n], считает [diff]) Мы получили 4 Но правильный ответ будет 2 Что мы получаем от math.floor (счетчики [n]//2) Отказ

Оригинал: “https://dev.to/ruarfff/day-18-max-number-of-k-sum-pairs-2dig”