方法一:回溯法
相当于组合类的回溯
class Solution {
public:
map<int,int> mp{{0,1},{1,2},{2,4},{3,8},{4,1},{5,2},{6,4},{7,8},{8,16},{9,32}};
vector<string> res; //保存结果
void backtrack(pair<int,int>& time,int num,int start){
if(num==0){ //1的个数等于num满足条件返回
if(time.first>11 || time.second>59) //除去非法
return;
res.push_back(to_string(time.first)+":"+ (time.second<10? "0"+to_string(time.second):to_string(time.second)) );
return; //构造格式返回
}
for(int i=start;i<10;i++){ //从后一个位置开始
if(time.first>11 || time.second>59) //枝剪
continue;
pair<int,int> store=time; //保存状态,做出选择
if(i<4)
time.first+=mp[i];
else
time.second+=mp[i];
backtrack(time,num-1,i+1); //进入下一层
time=store; //撤销选择
}
}
vector<string> readBinaryWatch(int num) {
pair<int,int> time; //路径,初始化为0:0
backtrack(time,num,0); //参数:路径,个数,选择参数
return res;
}
};
方法二:技巧
class Solution {
public:
int countone(int num){ //计算整数Num中1的个数
int res=0;
while(num>0){
num=num&(num-1);
++res;
}
return res;
}
vector<string> readBinaryWatch(int num) {
vector<string> res;
for(int i=0;i<12;i++){ //时
for(int j=0;j<60;j++){ //分
if(countone(i)+countone(j)==num){ //如果 时+分 的1的个数等于num,将组合放入结果
//将 时和分 转为字符串组合,若分小于10前面要补上0
res.push_back(to_string(i)+":"+ (j<10?"0"+to_string(j):to_string(j)));
}
}
}
return res;
}
};