力扣练习题
78子集
题目分析及c#代码实现
我们利用二进制的位运算2的nums的长度次方为子集的列表长度,我们需要最长nums的长度的二进制来进行计算保留子集,对每一个二进制数上的每一位分别对1的左移取与运算,如果不为零就为一个子集的一部分(按左移的数k来取nums[k])。
public class Solution {
public IList<IList<int>> Subsets(int[] nums) {
int num = 1;
for(int i=1;i<=nums.Length;i++){
num*=2;
}
num-=1;
IList<IList<int>> result = new List<IList<int>> ();
for(int j=0; j<=num; j++){
IList<int> once = new List<int>();
for(int k=0; k<nums.Length; k++){
int bit = 1<<k;
if((j&bit)!=0){
once.Add(nums[k]);
}
}
result.Add(once);
}
return result;
}
}