Mediumbacktracking

Решить задачу Permutations II (LeetCode 47)?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

LeetCode 47. Все уникальные permutations массива с duplicates. Сортировка + skip duplicates.

# Подход через counter (проще для понимания)
from collections import Counter
def permuteUnique(nums):
    counter = Counter(nums)
    result = []
    def backtrack(path):
        if len(path) == len(nums):
            result.append(path[:])
            return
        for num in counter:
            if counter[num] > 0:
                counter[num] -= 1
                path.append(num)
                backtrack(path)
                path.pop()
                counter[num] += 1
    backtrack([])
    return result

# Альтернатива: sort + skip
# if i > 0 and nums[i] == nums[i-1] and not used[i-1]: continue

Через sort + skip: условие nums[i] == nums[i-1] and not used[i-1] гарантирует, что одинаковые элементы берутся в исходном порядке, избегая duplicates. Без duplicates (LeetCode 46) — skip не нужен. Подсчёт по counter — общий паттерн для permutations/subsets с duplicates.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.