Hot100シリーズ--78のleadcode。サブセット

、数値列、実際には、順列及び組合せのサブセットを参照
例:[0,1]のサブセットに対応している:[] [0] [1]〜[1,1] 4。
:一般的に二つの方法に対応するビット操作バックトラック
ここで行うにはビット・コンピューティングを使用します。

ビットコンピューティング

存在しない場合に存在するn個の数、:長さnの配列は、それらの置換のように理解することができる行います。
例えば、[2,3]の配列は、組み合わせることができる:[1,2]、次いで1及び2は、存在している、3が存在しない場合、
我々は所定のを見ることができます:標識の存在は、0でフラグが存在しない
[] 000の組み合わせをマークするために使用することができると[1,3] 101の組み合わせを標識することができ、その後、[2]の組成物が110で標識することができます。
(注:これは理解の容易さ、マーク列直感的な対応の位置に関係なく、配列インデックスの、
実際のコードは、対応する添え字に関係している)である
ので。

コンビナトリアル問題アレイは、各桁は、問題の存在または不在に変換されます。

:3つの数字があり、それぞれが2例有無を有するであろう、すなわち配列の8種類の合計があります
000、001、010、011、100、101、110、111
であるアレイに対応
: []、[3]、[2]、[2,3]、[1]、[1,3]、[1,2]、[2,3]

ここでの焦点 10進数に対応する二進数上記のように01マークが6,7である場合。
これらの図は、集合的に(対応する位置に存在するための符号)フラグに本明細書で言及されています。
だから、私はすでに、nの合計合成時間が知っている場合、その後、0から(N-1)が存在することになるフラグ番目の対応する位置が存在する数をマークします。
そして、対応するコードは、どのようにそれはありますか?これは、配列[6,7,8]が挙げられます。
対応する図6,7,8添字0であり、対応する位置は、(添字<< 1)であり、
次いで、6、7で最初の(1 << 0)フラグに対応それは、(1 << 1)、8フラグの位置3(1 << 2)に対応する2ビットのフラグに相当します。
したがって、対応する組み合わせであるときに実際のコードフラグ= 1(001ビット)[6]、フラグ= 3時間(011ビット)は、対応する組み合わせがある場合、[6,7]。

PS:質問の形式で出力されるので:[[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]
これは、その後、Cを達成するために、良い感じではありませんので、私は密かに達成するためのpythonを取ったが、原則はまだ同じです!

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        subList = []
        length = len(nums)
        totalCount = pow(2, length)     # 得到子集的总个数
        for flag in range(totalCount):   # 遍历各个flag标记
            sub = []
            for xiabiao in range(length):  # 遍历数组下标,查看对应位置的数字是否存在
                if flag & (1<<xiabiao):
                    sub.append(nums[xiabiao])  # 如果对应的数字存在,就把该数字放入新数组中
            subList.append(sub)
        return subLis

おすすめ

転載: www.cnblogs.com/payapa/p/11124106.html