401. 二进制手表

在这里插入图片描述在这里插入图片描述
方法一:回溯法

相当于组合类的回溯

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值