[LeetCode]78.Subsets

来源:互联网 发布:多线程编程技术 编辑:程序博客网 时间:2024/06/10 14:05

原题:

Given a set of distinct integers, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,3], a solution is:

[  [3],  [1],  [2],  [1,2,3],  [1,3],  [2,3],  [1,2],  []]
这道题就是生成子集的问题,高中知识,子集个数为2^n个。所以我的思路是0-2^n的循环,然后将十进制数对应到二进制,根据二进制的值对应到某个元素是否在某个子集中。详细代码(代码不好,速度有点慢,leetcode上有大神的代码,估计C语言会快一点?):

class Solution(object):    def subsets(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        length = len(nums)  # size of nums        result = []         if length == 0:            return result        for x in xrange(0, 2**length):            s = bin(x)            sub = []            n = x            # decimal to binary            for i in xrange(0, length):                if n == 0:                    break                else:                    if n % 2 == 1:                        sub.append(nums[i])                    n = n / 2            result.append(sub)        return result

其中十进制to二进制的代码,求余求商,求出的结果是从低位到高位(对应学的十进制转化二进制的方式,结果从下到上排列),上边用的时候有些许变化:

n = 12print bin(n)while n != 0:    print n%2    n = n/2
其实python中有十进制到二进制转化的函数: bin()

bin(x)
Convert an integer number to a binary string. The result is a valid Python expression. If x is not a Python int object, it has to define an __index__() method that returns an integer.

转化为了字符串,10 - 0b1010,注意0b也是字符串的内容,所以真正的二进制字符串是从索引2开始的。

0 0
原创粉丝点击