leetcode算法题基础(十一)回溯法(一)401 题 二进制手表

二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。

每个 LED 代表一个 0 或 1,最低位在右侧。

 

 

 

例如,上面的二进制手表读取 “3:25”。

给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。

 

示例:

输入: n = 1
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
 

提示:

输出的顺序没有要求。
小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。
分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。
超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现 "13:00", "0:61" 等时间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-watch
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

from itertools import combinations
class Solution:
    def readBinaryWatch(self, num):
        """
        :type num: int
        :rtype: List[str]
        """
        res = []
        self.dfs(num, 0, res)
        return res
        
    def dfs(self, num, hours, res):
        if hours > num : return
        for hour in combinations([1, 2, 4, 8], hours):
            hs = sum(hour)
            if hs >= 12 : continue
            for minu in combinations([1, 2, 4, 8, 16, 32], num - hours):
                mins = sum(minu)
                if mins >= 60 : continue
                res.append("%d:%02d" % (hs, mins))
        self.dfs(num, hours + 1, res)

 

 

    def readBinaryWatch(self, num: int) -> List[str]:
        """
        思路: 递归回溯法
        """
        if num < 0:
            return []
        # 一共只有10个灯
        res, hour, minute = [], [1, 2, 4, 8], [1, 2, 4, 8, 16, 32]
        def traceback(num, index, status):
            """
            num : 还剩下的可点亮的灯的数量
            index: 是当前选择点亮哪一个灯
            status: 记录是哪些位置的灯被点亮了
            
            """
            if num == 0: # 没有可以点亮的灯了,记录当前结果,并返回
                h = sum([i*j for i,j in zip(hour, status[:4])])
                m = sum([i*j for i,j in zip(minute, status[4:])])
                if h < 12 and m < 60:
                    res.append('%d:%02d' % (h, m))
                return
            for i in range(index, 10):
                status[i] = 1 # 做出下一步的选择
                traceback(num-1, i+1, status) # 在剩下的灯里面去点亮num-1个灯
                status[i] = 0 # 返回到上一步选择时的状态            
        
        traceback(num, 0, [0] * 10)
        return res

作者:_defined
链接:https://leetcode-cn.com/problems/binary-watch/solution/bao-li-fa-he-hui-su-fa-xie-pythonjiu-yao-jian-dan-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2020-11-18 10:48  秋华  阅读(259)  评论(0编辑  收藏  举报