二进制手表顶部有 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” 等时间。
回溯的for循环代码:
/*
思路:回溯,使用数组存储LED数,回溯函数中使用两个int存储小时和分钟
时间复杂度:O(2^n)*/
class Solution {
List<String> result;
public List<String> readBinaryWatch(int num) {
result=new ArrayList<String>();
//判断输入
if(num<0)
return result;
//LED灯,前四个为小时,后六个为分钟
int[] nums=new int[]{8,4,2,1,32,16,8,4,2,1};
backTrack(num,nums,0,0,0);
return result;
}
public void backTrack(int num,int[] nums,int start,int hour,int minute){
if(num==0){
//判断时间是否正确
if(hour>11||minute>59)
return;
StringBuilder tmp=new StringBuilder();
//小时
tmp.append(hour);
tmp.append(":");
//分钟
if(minute<10)
tmp.append(0);
tmp.append(minute);
result.add(new String(tmp));
return ;
}
for(int i=start;i<nums.length;i++){
/*回溯做选择*/
//判断是小时还是分钟
if(i<4)//小时
hour+=nums[i];
else
minute+=nums[i];
//递归
backTrack(num-1,nums,i+1,hour,minute);
/*回溯取消选择*/
if(i<4)//小时
hour-=nums[i];
else
minute-=nums[i];
}
}
}
class Solution {
int[] nums=new int[10];
List<String> ans=new ArrayList<>();
int num;
public List<String> readBinaryWatch(int num) {
this.num=num;
backtrack(0,0);
return ans;
}
public void backtrack(int k,int n){
if(n==num){
int hour=change1();
int miniute=change2();
if(hour>=12 || miniute>=60) return;
StringBuilder str=new StringBuilder();
str.append(hour).append(":");
if(miniute<=9) str.append("0").append(miniute);
else str.append(miniute);
ans.add(str.toString());
return ;
}
if(k>=10) return ;//这个if放在if(n==num)后面
nums[k]=1;
backtrack(k+1,n+1);
nums[k]=0;
backtrack(k+1,n);
}
public int change1(){
int res=0;
int bit=0;
for(int k=3;k>=0;k--){
if(nums[k]==1) res=res+(1<<bit);
bit++;
}
return res;
}
public int change2(){
int res=0;
int bit=0;
for(int k=9;k>=4;k--){
if(nums[k]==1) res=res+(1<<bit);
bit++;
}
return res;
}
}