【leetcode】【401】二进制手表
https://leetcode.cn/problems/binary-watch/description/
分析
这是典型的循环DFS问题。
循环DFS一般应用在:
1. 输出字符的按位全排列。(比如一共4个数字,输出3个数字的全部组合)
2. 输出字符的全排列。(结合visited数组)
3. 本题这种组合型问题。
思路
对函数进行拆分。
首先我们要有一个总入口,控制异常场景等情况(比如全为0)。
其次,我们需要有DFS总入口。
最后,我们需要一个convert函数,将灯翻译成数字,并且校验结果的有效性。
代码
class Solution: """ 通过递归的形式, 对其进行赋值 """ def readBinaryWatch(self, turnedOn: int): self.watchs = [0] * 10 self.results = [] if turnedOn == 0: val = self.convert_str2str() if val: self.results.append(val) else: self.dfs1(turnedOn, 0) return self.results def convert_str2str(self): hour = '' for i in range(4): hour += str(self.watchs[i]) hour = int(hour, 2) minute = '' for i in range(4, len(self.watchs)): minute += str(self.watchs[i]) minute = int(minute, 2) if hour > 11 or minute > 59: return False result = '%d:%02d' % (hour, minute) return result def dfs1(self, turnedOn, start_idx): for i in range(start_idx, len(self.watchs)): turnedOn -= 1 start_idx += 1 self.watchs[i] = 1 if turnedOn == 0: val = self.convert_str2str() if val: self.results.append(val) else: self.dfs1(turnedOn, start_idx) self.watchs[i] = 0 turnedOn += 1 s = Solution() print(s.readBinaryWatch(0))
2024二刷:
class Solution: def readBinaryWatch(self, turnedOn: int) -> List[str]: self.watchs = [0] * 10 self.results = [] self.dfs(turnedOn, 0) return self.results def formatter(self): hours = '' minutes = '' for i in range(len(self.watchs)): if i < 4: hours += str(self.watchs[i]) else: minutes += str(self.watchs[i]) hours, minutes = int(hours, 2), int(minutes, 2) if hours > 11 or minutes > 59: return False return "%d:%02d" % (hours, minutes) def dfs(self, turnedOn, startIdx): if turnedOn == 0: val = self.formatter() if val: self.results.append(val) return for i in range(startIdx, len(self.watchs)): self.watchs[i] = 1 turnedOn -= 1 startIdx += 1 self.dfs(turnedOn, startIdx) self.watchs[i] = 0 turnedOn += 1