401. Binary Watch

A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59).

Each LED represents a zero or one, with the least significant bit on the right.

For example, the above binary watch reads “3:25”.

Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent.

Example:

Input: n = 1
Return: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]

Note:

The order of output does not matter.
The hour must not contain a leading zero, for example "01:00" is not valid, it should be "1:00".
The minute must be consist of two digits and may contain a leading zero, for example "10:2" is not valid, it should be "10:02".

Input (num)for i=max(0,num6):min(4,num)Ci4×Cnumi6

解题代码

class Solution {

public:
    // 从[curIndex..len)中寻找k个灯亮的中间计算值放在val中,最终结果值存放在vec中
    void DFS(int len, int k, int curIndex, int val, vector<int>& vec)
    {
        if (k == 0 && len == 4 && val < 12) vec.push_back(val);
        if (k == 0 && len == 6 && val < 60) vec.push_back(val);
        if (curIndex == len || k == 0) return;

        // 递归过程:分情况讨论,当前位置的灯亮还是不亮
        // 尝试一下不亮当前curIndex这一位
        DFS(len, k, curIndex + 1, val, vec);
        // 尝试亮当前这一位,则要亮的灯就少一个,同样从下一个位置开始搜索
        DFS(len, k - 1, curIndex + 1, val + pow(2, curIndex), vec);

    }

    vector<string> readBinaryWatch(int num) {
        vector<string> ans;
        // 考虑时针的亮灯个数的范围时,最少就是从0或者把分针赛满过后必须赛的,最大不超过4或者num就不够4
        for (int i = max(0, num - 6); i <= min(4, num); i++)
        {
            vector<int> vec1, vec2;
            // C(4,i) X C(6,num-i)
            DFS(4, i, 0, 0, vec1), DFS(6, num - i, 0, 0, vec2);

            // 组合起来
            for (auto hour : vec1)
            for (auto min : vec2)
            {
                string minute_str = (to_string(min).size() == 1 ? "0" : "") + to_string(min);
                ans.push_back(to_string(hour) + ":" + minute_str);
            }
        }
        return ans;
    }
};

测试

class TestHelper{
    Solution s;
public:
    void run(){

        vector<string> res = s.readBinaryWatch(1);

        // 显示结果信息
        Utils::showVecInfo(res);
    }
};

结果

vector : [
                0:32
                0:16
                0:08
                0:04
                0:02
                0:01
                8:00
                4:00
                2:00
                1:00
         ]
请按任意键继续. . .
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值