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” 等时间。
题解
dfs深搜回溯
用一个变量choice表明我们选择小时还是分钟,注意把不合法选择去掉,详细过程见代码
代码
int hour[5] = {0,1,2,4,8};
int minutes[6] = {1,2,4,8,16,32};
vector<string> ans;
void dfs(int h,int m,int now,int chioce,int hn,int mn,int num){ //hn为小时的亮灯数量,mn为分钟的亮灯数量
if(chioce == 1){ //选择分钟
if(hn+mn == num){
if(h<12 && m<60){ //合法时间
if(m < 10) ans.push_back(to_string(h)+":0"+to_string(m));
else ans.push_back(to_string(h)+":"+to_string(m));
}
return;
}else if(num-hn <= 6){ //分钟最多量6个灯
for(int i=now; i<6; i++){
m += minutes[i];
mn++;
dfs(h,m,i+1,1,hn,mn,num);
m -= minutes[i];
mn--;
}
}
}else if(hn<num || now==0){ //选择小时
for(int i=now; i<5; i++){
if(i==0){ //小时无灯亮
dfs(h,m,0,1,hn,mn,num);
}else{
h += hour[i];
hn += 1;
dfs(h,m,i+1,0,hn,mn,num);
dfs(h,m,0,1,hn,mn,num);
h -= hour[i];
hn--;
}
}
}
}
vector<string> readBinaryWatch(int num) {
dfs(0,0,0,0,0,0,num);
return ans;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-watch
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。