2021.05.04二进制手表
(题目来源:https://leetcode-cn.com/problems/binary-watch/)
题目描述
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。
每个 LED 代表一个 0 或 1,最低位在右侧。
例如,上面的二进制手表读取 “3:25”。
给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。
思路
- 求出亮k个灯的所有示数,可以将所有的灯都通过一个数组下标进行表示,通过回溯算法模拟k个灯亮的所有情况。
- 为区分小时灯和分钟灯,可以按照一定的区间将它们分隔开来。
- DFS函数中,设定一个参数num,为还剩几个灯没有亮。
代码
List<String> res;
int[] nums = {8,4,2,1,32,16,8,4,2,1};
public List<String> readBinaryWatch(int turnedOn) {
res = new ArrayList<>();
dfs(turnedOn,0,0,0); //全灭
return res;
}
void dfs(int num, int ind, int h, int m){
if(h > 11 || m > 59) return;
if(num == 0) {
res.add(h+":"+((m<10)?"0"+m:m));
}
for(int i = ind; i < nums.length; i++) {
if(i < 4) dfs(num-1, i, h+nums[i], m);
else dfs(num-1, i, h, m+nums[i]);
}
}