メインコンテンツへスキップ

NeetCode 150 [Backtracking]medium:Subsets

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

NeetCodeのSolutionを書いていく
#

Subsets
#

問題
#

ユニークな正数の配列numsが与えられます。 全てのnumsのサブセットを返しなさい。 重複するサブセットがあってはいけません。サブセットの順序は任意です。

#

Input: nums = [1,2,3] Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

Input: nums = [7] Output: [[],[7]]

制約
#

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • 計算量:O(n * (2^n))
  • 計算時間:O(n)

メモ
#

全ての数を選択するかしないかなので、O(2^n)の組み合わせがある。 この組み合わせのサブセットを以下に効率的に作るか。 Setにサブセットを保持し、numsの値を頭から見て追記するかしないかの判断をしながらSetを拡張していくのではだめか?

行けちゃったけど、チョット強引かな。 特にsubsets.copy()のあたりが怪しい。 メモリがO(n)ではなさそう。

from typing import List, Tuple


class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        subsets: set[Tuple] = set()
        subsets.add(())

        for num in nums:
            for subset in subsets.copy():
                subsets.add(subset + (num,))

        return [list(subset) for subset in subsets]
Reply by Email

関連記事

NeetCode 150 [Heap / Priority Queue]medium:Design Twitter
· loading · loading
NeetCode 150 [Heap Priority Queue]medium:Task Scheduler
· loading · loading
NeetCode 150 [Heap/Priority Queue]medium:KthLargestElementInAnArray
· loading · loading