該題是力扣上面的乙個題,感覺思路不錯就摘抄下來做個筆記。以後準備定期耍上面的題來提高一下自己的演算法基礎。題目描述如下:
給定一組不含重複元素的正數陣列 nums,返回該陣列所有可能的子集(冪集)。說明:解集不能包含重複的子集。
示例:輸入: nums = [1,2,3]
輸出:[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
]
解題思路如下:乙個長度是n的陣列其子集的個數subsetssize=2的n次方,即subsetssize=(int)math.pow(2,nums.length)
。換而言之陣列nums的子集構成的新陣列的長度就是2的n次方。而且最關鍵的是nums陣列長度n構成的二進位制數字的最大值就是subsetssize。就比如說[1,2,3]的子集的個數是8,陣列長度是3,3用二進位制為011:從000-111之間的長度就是子集的個數。
且0-7八個數字對應的二進位制就是000 001 010 011 100 101 110 111,且原陣列中的下標為0,1,2三個數,正好對應著二進位制的位數。在這裡以101為例,假設1代表著取nums對應位置的數字,0代表不取,那麼101就代表著取陣列nums中第0個和第2個位置的數字構成乙個子集:[1,3],同理110對應的子集就是[1,2]:
所以如上**題思路也很簡單,迴圈遍歷subsets的長度0-7的每乙個數字,比如以5(即101)為例,獲取其二進位制101的每乙個位數,如果是1就將nums的index位置對應的數字新增到乙個新的子集裡。那麼怎麼判斷是否是1呢,核心思想:就是依靠移位運算》來判斷101中每乙個位數跟1進行&運算判斷是否是1即可:
int arrayindex = 0;
int setsizeindex= i;
listtemp = new arraylist<>();
//number=0說明當前的數不取
while(setsizeindex!= 0)
//右移一位
setsizeindex=setsizeindex>>1;
arrayindex++;
}
最終實現演算法如下:
public list> subsets(int nums)
setsizeindex=setsizeindex>>1;
arrayindex++;
}result.add(temp);
}return result;}}
演算法的思路很巧妙,到此分析結束,當然也有別的解法。 數字題2 求乙個陣列的全部子集
問題描述 一共16個,事實上n個元素的集合的子集共有2n 個 包含空集 方法一 遞迴 定義乙個元素陣列mark 用來存放第i個元素,當第i個元素不出現在子集中,對應的位置為空。偽 如下 共n個元素,每個元素取或不取,subset 判斷第i個元素 方法二 位操作 集合set 對於任意乙個元素,在每個子...
判斷乙個陣列是否是另乙個陣列的子集
給兩個陣列 arr1 0.m 1 和arr2 0.n 1 判斷arr2是否是arr1的乙個子集合,兩個陣列都是未排序的。例子 input arr1 arr2 output arr2 is a subset of arr1 input arr1 arr2 output arr2 is a subset...
求乙個陣列集合的所有子集以及其寬度解法
對於長度為a.length的陣列,構建乙個長為a.length的01010這樣的序列,然後其所有子集就是所有的01010這樣的情況集合,共有2 a.length個。以下為1道leetcode題 對於每乙個1000.0000至111.1111,都是經歷先將0處變為1,再將1處變為1,再將2處變為1,直...