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