zoukankan      html  css  js  c++  java
  • 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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/13998566.html

  • 相关阅读:
    归类常用控件GroupBox、TabControl、Expander
    ScrollViewer控件
    捕获鼠标位置
    5、标记拓展
    如何实现文件增量同步——算法
    常用的 Nand Flash 指令如下:
    Consistent Hashing算法
    循环冗余检验 (CRC) 算法原理
    yaffs2根文件系统的构建过程
    linux内存管理之uboot第一步
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13998566.html
Copyright © 2011-2022 走看看