78. Subsets 子集
給定一組不含重復(fù)元素的整數(shù)數(shù)組?nums,返回該數(shù)組所有可能的子集(冪集)。
說明:解集不能包含重復(fù)的子集。
示例:
輸入: nums = [1,2,3] 輸出: [[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ]二進(jìn)制
? ? ? ?①使用兩層循環(huán),外層循環(huán)為子集個(gè)數(shù),對于集合長度為N,子集個(gè)數(shù)為。外層循環(huán)每循環(huán)一次一個(gè)子集。內(nèi)層循環(huán)用來判斷二進(jìn)制下標(biāo)為i的位置數(shù)是否為"1",如果對應(yīng)位為1,那么就輸出這個(gè)位,如果對應(yīng)位為0,那么不輸出這個(gè)位。
? ? ? ?②以集合[1,2,3]為例,N = len([1,2,3]),外層循環(huán) i 取值范圍為[0,7],內(nèi)層循環(huán)用于判斷 i 對應(yīng)二進(jìn)制下標(biāo)為j的位置是否為1。如果 (i >>j)%2為真,那么輸出此子集。
? ? ? ?③當(dāng) i =0時(shí),無論 i 對應(yīng)二進(jìn)制000右移0位,1位,還是2位,即(i>>j)%2始終為0(假),輸出空集。
? ? ? ④當(dāng) i =1時(shí), i 對應(yīng)二進(jìn)制001右移0位,即(i>>j)%2為1(真),輸出[1]。 i 對應(yīng)二進(jìn)制001右移1位為000,即(i>>j)%2為0(假),不追加。 i 對應(yīng)二進(jìn)制001右移2位為000,即(i>>j)%2為0(假),不追加。最終輸出[1]。
? ? ? ?......
? ? ?⑤當(dāng) i = 3時(shí),i 對應(yīng)二進(jìn)制011右移0位,即(i>>j)%2為1(真),輸出[1]。 i 對應(yīng)二進(jìn)制011右移1位為001,即(i>>j)%2為1(真),追加輸出[1,2]。 i 對應(yīng)二進(jìn)制011右移2位為000,即(i>>j)%2為0(假),不追加。最終輸出[1,2]。
? ? ? ?......
? ? ⑥當(dāng) i = 6時(shí),i 對應(yīng)二進(jìn)制110右移0位,即(i>>j)%2為0(假),輸出[]。 i 對應(yīng)二進(jìn)制110右移1位為011,即(i>>j)%2為1(真),追加輸出[2]。 i 對應(yīng)二進(jìn)制110右移2位為001,即(i>>j)%2為1(真),追加輸出[2,3]。最終輸出[2,3]。
? ? ⑦當(dāng) i = 7時(shí),i 對應(yīng)二進(jìn)制111右移0位,即(i>>j)%2為1(真),輸出[1]。 i 對應(yīng)二進(jìn)制111右移1位為011,即(i>>j)%2為1(真),追加輸出[1,2]。 i 對應(yīng)二進(jìn)制111右移2位為001,即(i>>j)%2為1(真),追加輸出[1,2,3]。最終輸出[1,2,3]。
Code
def subsets(self, nums: List[int]) -> List[List[int]]:length, ans = len(nums), []for i in range(2 ** length):tmp = []for j in range(length):if (i >> j) % 2:tmp.append(nums[j])ans.append(tmp)return ans總結(jié)
以上是生活随笔為你收集整理的78. Subsets 子集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 404. Sum of Left Lea
- 下一篇: 538. Convert BST to