[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 signific

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”.

分别对小时、分钟两个部分进行回溯,然后将结果进行组合。

public class Solution {
    int hour[] = new int[] { 1, 2, 4, 8 };
    int minu[] = new int[] { 1, 2, 4, 8, 16, 32 };

    public List<String> readBinaryWatch(int num) {
        List<String> res = new ArrayList<String>();
        for (int i = 0; i <= num; i++) {
            dspCombination(hour, i, 0, true);
            dspCombination(minu, num - i, 0, false);

            for (int m : hs) {
                for (int n : ms) {
                    if (n == 0)
                        res.add("" + m + ":00");
                    else {
                        if (n / 10 == 0)
                            res.add("" + m + ":0" + n);
                        else
                            res.add("" + m + ":" + n);
                    }
                }
            }
            hs.clear();
            ms.clear();
        }
        return res;
    }

    List<Integer> list = new ArrayList<Integer>();
    List<Integer> hs = new ArrayList<Integer>();
    List<Integer> ms = new ArrayList<Integer>();

    private void dspCombination(int[] nums, int k, int level, boolean flag) {
        if (list.size() == k) {
            int sum = 0;
            for (int num : list) {
                sum += num;
            }
            if (flag) { // 当前是hour
                if (sum <= 11)
                    hs.add(sum);
            } else {
                if (sum <= 59)
                    ms.add(sum);
            }
            return;
        } else if (list.size() > k) {
            return;
        } else {
            for (int i = level; i < nums.length; i++) {
                list.add(nums[i]);
                dspCombination(nums, k, i + 1, flag);
                list.remove(list.size() - 1);
            }
        }
    }
}
目录
相关文章
|
6月前
|
机器学习/深度学习 存储 算法
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
|
4月前
|
存储
LeetCode------递归(爬楼梯)
这篇文章通过LeetCode上的"爬楼梯"问题介绍了递归的基本概念和实现方法,包括递归公式的推导、基本递归实现、使用备忘录优化以避免重复计算,以及自底向上的迭代方法来提高效率。
LeetCode------递归(爬楼梯)
|
6月前
|
存储 算法 数据挖掘
python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】
python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】
|
6月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
6月前
|
存储 机器学习/深度学习 算法
python 五种算法转置后翻转、层次旋转、递归分块、一次性旋转、环状替换 实现旋转图像【力扣题48】
python 五种算法转置后翻转、层次旋转、递归分块、一次性旋转、环状替换 实现旋转图像【力扣题48】
|
6月前
|
存储 算法 数据可视化
力扣156题最全解法:如何上下翻转二叉树(递归与迭代方法详解,附图解)
力扣156题最全解法:如何上下翻转二叉树(递归与迭代方法详解,附图解)
|
6月前
|
存储 算法 数据可视化
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
|
6月前
|
存储 算法 数据可视化
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
|
6月前
|
SQL 算法 数据可视化
LeetCode题目92:反转链表ll 【python 递归与迭代方法全解析】
LeetCode题目92:反转链表ll 【python 递归与迭代方法全解析】
|
6月前
|
存储 传感器 算法
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用