leetcode 78.Subsets

#每天挖坑,填坑

原题链接 :78.Subsets

相关内容 : Array,Backtrcking,Bit Manipulation

解法1:Bit Manipulation,位操作

对于数组[1,2,3],可以用一个下标0和1表示是否选择该数字,0表示未选择,1表示选中,那么每一组3个0和1的组合表示一种选择,3位共有8种选择,分别是: 
000 对应[] 
001 对应[3] 
010 对应[2] 
011 对应[2,3] 
那么上面为1的位表示数组中该位被选中。 
那么只需要遍历0到1<< length中的数,判断每一个数中有那几位为1,为1的那几位即会构成一个子集
中的一个元素。

java

public List<List<Integer>> subsets(int[] nums) {
        int n = nums.length;
        List<List<Integer>> subsets = new ArrayList<>();
        for (int i =0; i <Math.pow(2,n);i++)
        {
            List<Integer> subset = new ArrayList<>();
            for (int j =0; j <n;j++)
            {
                if(((1<<j)& i )!= 0)
                    subset.add(nums[j]);
            }
            Collections.sort(subset);
            subsets.add(subset);
        }
        return subsets;
    }
}

python

def subsets(self, nums):
    res = []
    nums.sort()
    for i in xrange(1<<len(nums)):
        tmp = []
        for j in xrange(len(nums)):
            if i & 1 << j:  # if i >> j & 1:
                tmp.append(nums[j])
        res.append(tmp)
    return res

解法2: 组合|非递归实现

 

  1. 最外层循环逐一从 nums 数组中取出每个元素 num
  2. 内层循环从原来的结果集中取出每个中间结果集,并向每个中间结果集中添加该 num 元素
  3. 往每个中间结果集中加入 num
  4. 将新的中间结果集加入结果集中
python
def subsets(self, nums):
    res = [[]]
    for num in sorted(nums):
        res += [item+[num] for item in res]
    return res

java

public List<List<Integer>> subsets(int[] nums) {
        
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        res.add(new ArrayList<Integer>());
        
        for(int num:nums){
            int size = res.size();
            for(int i = 0;i <size ; i++){
                List<Integer> temp  = new ArrayList(res.get(i));
                temp.add(num);
                res.add(temp);
            }
        }
        return res;
    }
}

解法3 回溯算法


java

public List<List<Integer>> subsets(int[] S) {  
    List<List<Integer>> result = new ArrayList<>();  
    Arrays.sort(S);  
    getSubsets(result, new ArrayList<Integer>(), S, 0);  
    return result;  
    }  
    private void getSubsets(List<List<Integer>> result, List<Integer> list, int[] S, int start) {  
        result.add(new ArrayList<Integer>(list));  
        for(int i=start; i<S.length; i++) {  
            list.add(S[i]);  
            getSubsets(result, list, S, i+1);  
            list.remove(list.size()-1);  
        }  
    } 

python

    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        self.dfs(sorted(nums), 0, [], res)
        return res

    def dfs(self, nums, index, path, res):
        res.append(path)
        for i in range(index, len(nums)):
            self.dfs(nums, i+1, path+[nums[i]], res)

参考链接: https://blog.csdn.net/happyaaaaaaaaaaa/article/details/51604217


阅读更多
个人分类: leetcode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭