zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    Linux中磁盘mbr分区——实践篇
    Linux中磁盘分区——理论篇
    Linux中常用压缩打包工具
    自动化(脚本)安装httpd服务
    CentOS6.8环境下搭建yum网络仓库
    CentOS下rpm命令详解
    CentOS下yum命令详解
    CentOS7.3环境下源码安装httpd
    js对url进行编码和解码(三种方式区别)
    前端paging分页,前端设置每页多少条和当前页面的索引,传给后端,数据显示出来
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10353376.html
Copyright © 2011-2022 走看看