• 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".

    Approach #1: DFS + backtracking. [C++]

    class Solution {
    public:
        vector<string> readBinaryWatch(int num) {
            init();
            vector<string> ans;
            for (int i = 0; i <= num; ++i) {
                set<int> h;
                set<int> m;
                hours(i, h, 0);
                minutes(num-i, m, 0);
                
                string temp;
                for (int i : h) {
                    for (int j : m) {
                        //cout << i << ' ' << j << endl;
                        if (i >= 12 || j >= 60) continue;
                        temp = to_string(i);
                        temp += ":";
                        if (j < 10) temp += "0" + to_string(j);
                        else temp += to_string(j);
                        ans.push_back(temp);
                    }
                }
            }
            //sort(ans.begin(), ans.end());
            return ans;
        }
    
    private:
        vector<pair<int, bool>> hour;
        vector<pair<int, bool>> minute;
        
        void init() {
            for (int i = 0; i < 4; ++i) 
                hour.push_back({pow(2, i), true});
            for (int i = 0; i < 6; ++i)
                minute.push_back({pow(2, i), true});
        }
        
        void hours(int n, set<int>& h, int h_) {
            if (n == 0) {
                h.insert(h_);
                return;
            }
            for (auto &i : hour) {
                if (i.second) {
                    i.second = false;
                    hours(n-1, h, h_+i.first);
                    i.second = true;
                }
            }
        }
        
        void minutes(int n, set<int>& m, int m_) {
            //cout << "m_ = " << m_ << " ";
            if (n == 0) {
                m.insert(m_);
                return;
            }
            for (auto &j : minute) {
                if (j.second) {
                    j.second = false;
                    minutes(n-1, m, m_+j.first);
                    j.second = true;
                } 
            }
        }
    };
    

      

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    hdu 4849
    HDU4850 构造一个长度为n的串,要求任意长度为4的子串不相同
    2014 多校第一场官方题解。
    hdu4862 2014多校B题/ 费用流(最优情况下用不大于K条路径覆盖)(不同的解法)
    dp+分类讨论 Gym 101128E
    优先队列 逆向思维 Gym 101128C
    很好的脑洞题:dfs+暴力 Gym
    树dp...吧 ZOJ 3949
    扫描线(线段树)+贪心 ZOJ 3953
    dp ZOJ 3956
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10353376.html
Copyright © 2020-2023  润新知