[Leetcode][python]Subsets/Subsets II/サブセット/サブセットII

4640 ワード

Subsets
テーマの大意
異なる数値からなる集合を与え、その集合のすべてのサブセットを羅列する.
問題を解く構想.
下のコードを参照
コード#コード#
純粋な考え方.
参照先:https://shenjie1993.gitbooks.io/leetcode-python/078%20Subsets.html例を挙げると、集合[1],[1],[1]]の2つのサブセットがあり、その中に1つの要素を追加すると、[1,2]に[[[],[1],[2],[1,2]]の4つのサブセットがあり、1つの要素を新たに追加する際に、元のサブセットに基づいて、原子セットのすべての要素に新しい要素を加えた総集合であることがわかる.各サブセットの要素が降順でないように、まずすべての要素をソートします.
class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        result = [[]]
        for num in sorted(nums):
            result += [item + [num] for item in result]
        return result

配列問題DFSに沿って
class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        self.result = []
        nums.sort()
        for i in range(0, len(nums)+1):
            self.k = i
            self.combineHelper(0, [], nums)
        return self.result

    def combineHelper(self, length, temp, list_num):
        if length == self.k:
            self.result.append(temp[:])  #               
            return
        for i, num in enumerate(list_num):
            temp.append(num)
            self.combineHelper(length+1, temp, list_num[i+1:])
            temp.pop()

Subsets II
テーマの大意
異なる数値からなる集合を与え、その集合のすべてのサブセットを羅列する.繰り返しがある
問題を解く構想.
前の問題と同様に,重複があると余分なサブセットが生成されるという問題がある.参照先:https://shenjie1993.gitbooks.io/leetcode-python/078%20Subsets.htmlここで例を挙げると、集合[1],[1],[1]]の2つのサブセットがあり、その中に1つの要素を追加すると、[1,2],[1],[2],[1,2]]の4つのサブセットがあり、1つの要素を新たに追加する際に、元のサブセットに基づいて、原子セットのすべての要素に新しい要素を加えた総集合であることがわかる.各サブセットの要素が降順でないように、まずすべての要素をソートします.
コード#コード#
配列問題DFSに沿って
class Solution(object):
    def subsetsWithDup(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        result = [[]]
        nums.sort()  # sort()       ,sorted()        ,      
        temp_size = 0
        for i in range(len(nums)):
            start = temp_size if i >= 1 and nums[i] == nums[i - 1] else 0
            temp_size = len(result)  #     result    ,    start       
            for j in range(start, temp_size):
                result.append(result[j] + [nums[i]])
            print result
        return result

まとめ
純粋な考え方のやり方は明らかに効率が高く、この問題のラベルにはビット演算のやり方があり、暇です.