[LeetCode 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".

 

分析

这道题跟Permutations那道题目比较类似,都是属于找到各种组合。不过本题的点在于要在两个Array中寻找可能的组合,然后在将他们拼接在一块。但是对于Hour和Minute的长度和大小的要求需要单独的进行处理。

本题也是使用了递归的办法去遍历不同的num的数字。其中hour的num要求不能超过3个,minute的要求不能超过5个,不然一定不是一个合法的时间。

Code

class Solution {
public:
    vector<string> readBinaryWatch(int num) {
        vector<string> res;
        
        int hoursArray[] = {1, 2, 4, 8};
        int minutesArray[] = {1, 2, 4, 8, 16, 32};
        vector<int> hours(hoursArray, hoursArray + 4);
        vector<int> minutes(minutesArray, minutesArray + 6);
        
        for (int i = 0; i <= 3 && i <= num; i ++)
        {
            if (num - i > 5)
                continue;
            vector<int> hour;
            vector<int> minute;
            getTime(hours, i, 0, hour);
            getTime(minutes, num-i, 0, minute);
            for (int m = 0; m < hour.size(); m ++)
            {
                for (int n = 0; n < minute.size(); n ++)
                {
                    if (hour[m] > 11 || minute[n] > 59)
                        continue;
                    string ho = to_string(hour[m]);
                    string mi = to_string(minute[n]);
                    if (mi.size() < 2)
                        mi.insert(mi.begin(), '0');
                    res.push_back(ho + ":" + mi);
                }
            }         
        }
        return res;
    }
    
    void getTime(vector<int> nums, int num, int total, vector<int>& res)
    {
        if (num == 0)
        {
            res.push_back(total);
            return;
        }
        
        for (int i = 0; i < nums.size() - num + 1; i ++)
        {
            vector<int> tmpNum(nums.begin() + i + 1, nums.end());
            int tmpTotal = total + nums[i];
            getTime(tmpNum, num-1, tmpTotal, res);
        }
        return;
    }
};

运行效率

Runtime: 4 ms, faster than 100.00% of C++ online submissions for Binary Watch.

Memory Usage: 9 MB, less than 34.61% of C++ online submissions for Binary Watch.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值