【LeetCode每日一题】——401.二进制手表

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

二【题目难度】

  • 简单

三【题目编号】

四【题目描述】

  • 二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
  • 例如,下面的二进制手表读取 "4:51"
    在这里插入图片描述
  • 给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。
  • 小时不会以零开头:
    • 例如,"01:00" 是无效的时间,正确的写法应该是 "1:00"
  • 分钟必须由两位数组成,可能会以零开头:
    • 例如,"10:2" 是无效的时间,正确的写法应该是 "10:02"

五【题目示例】

  • 示例 1:

    • 输入:turnedOn = 1
    • 输出:[“0:01”,“0:02”,“0:04”,“0:08”,“0:16”,“0:32”,“1:00”,“2:00”,“4:00”,“8:00”]
  • 示例 2:

    • 输入:turnedOn = 9
    • 输出:[]

六【题目提示】

  • 0 <= turnedOn <= 10

七【解题思路】

  • 该题目很容易想到使用回溯+剪枝来解决
  • 我们需要在10个灯中选择n个灯点亮,并计算其时间和,需要注意要判断该时间和是否合理,如果不合理(小时超过11,分钟超过59)需要进行剪枝
  • 上面提到“选择n个灯点亮”,我们肯定不能一起全部点亮,所以需要用到回溯,一个一个选择,还可以进行不同的组合
  • 为了实现“选择n个灯点亮”,我们可以设置小时数组和分钟数组,长度为10,不足10位补零,目的是使用这两个数组来模拟小时和分钟的亮灯情况(数组索引选中的值即为亮的灯)
  • 具体实现可以参考下面的代码,最后按照回溯+剪枝的方法将结果计算出并返回即可

八【时间频度】

  • 时间复杂度: O ( C 10 n ) O(C_{10}^{n}) O(C10n) n n n为传入的参数值
  • 空间复杂度: O ( n ) O(n) O(n) n n n为传入的参数值

九【代码实现】

  1. Java语言版
class Solution {
    public List<String> readBinaryWatch(int turnedOn) {
        // 定义时间数组
        int[] hours = {1, 2, 4, 8, 0, 0, 0, 0, 0, 0};
        int[] minutes = {0, 0, 0, 0, 1, 2, 4, 8, 16, 32};

        // 定义结果列表
        List<String> res = new ArrayList<>();

        // 回溯计算可能的时间组合
        backtrack(turnedOn, 0, 0, 0, res, hours, minutes);

        // 返回结果
        return res;
    }

    private void backtrack(int count, int index, int hour, int minute, List<String> res, int[] hours, int[] minutes) {
        if (hour > 11 || minute > 59) {
            return;
        }
        if (count == 0) {
            res.add(String.format("%d:%02d", hour, minute));
        }
        for (int i = index; i < 10; i++) {
            backtrack(count - 1, i + 1, hour + hours[i], minute + minutes[i], res, hours, minutes);
        }
    }
}
  1. Python语言版
class Solution:
    def readBinaryWatch(self, turnedOn: int) -> List[str]:
        # 定义时间数组
        hours = [1, 2, 4, 8, 0, 0, 0, 0, 0, 0]
        minutes = [0, 0, 0, 0, 1, 2, 4, 8, 16, 32]

        # 定义结果列表
        res = []

        # 回溯计算可能的时间组合
        def backtrack(count, index, hour, minute):
            if hour > 11 or minute > 59:
                return
            if count == 0:
                res.append("%d:%02d" % (hour, minute))
                return
            for i in range(index, 10):
                backtrack(count - 1, i + 1, hour + hours[i], minute + minutes[i])
        backtrack(turnedOn, 0, 0, 0)

        # 返回结果
        return res
  1. C语言版
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

#define MAX_RES_SIZE 256

// 定义回调函数来递归查找所有可能的时间组合
void backtrack(int count, int index, int hour, int minute, char res[MAX_RES_SIZE][6], int *returnSize, int * hours, int *minutes)
{
    if (hour > 11 || minute > 59)
    {
        return;
    }
    if (count == 0)
    {
        sprintf(res[*returnSize], "%d:%02d", hour, minute);
        (*returnSize)++;
        return;
    }
    for (int i = index; i < 10; i++)
    {
        backtrack(count - 1, i + 1, hour + hours[i], minute + minutes[i], res, returnSize, hours, minutes);
    }
}

char** readBinaryWatch(int turnedOn, int* returnSize)
{
    // 定义时间数组
    int hours[] = {1, 2, 4, 8, 0, 0, 0, 0, 0, 0};
    int minutes[] = {0, 0, 0, 0, 1, 2, 4, 8, 16, 32};

    // 分配空间用于存储结果
    char (*res)[6] = malloc(MAX_RES_SIZE * sizeof(*res));
    *returnSize = 0;

    // 开始递归
    backtrack(turnedOn, 0, 0, 0, res, returnSize, hours, minutes);

    // 转换为char**返回
    char** finRes = malloc(*returnSize * sizeof(char*));
    for (int i = 0; i < *returnSize; i++)
    {
        finRes[i] = res[i];
    }
    return finRes;
}

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C语言版
    在这里插入图片描述


http://www.niftyadmin.cn/n/5668144.html

相关文章

学习风格的类型

学习风格是指个体在学习过程中偏好的方式和方法。不同的学习风格反映了人们在接收、处理和记忆信息方面的不同偏好。了解自己的学习风格可以帮助提高学习效率和效果。以下是几种常见的学习风格类型&#xff1a; 1. 视觉型&#xff08;Visual Learner&#xff09; 特点&#x…

c++:tinyxml2如何存储二叉树

在 TinyXML-2 或任何其他 XML 库中&#xff0c;存储具有左右子节点的多层二叉树时&#xff0c;通常会将每个节点表示为一个 XML 元素&#xff0c;并通过嵌套子元素的方式反映树的结构。二叉树的左右子节点可以作为 XML 元素的子元素来存储。为了明确树的层次结构&#xff0c;每…

YOLOv8改进 - 注意力篇 - 引入ECA注意力机制

一、本文介绍 作为入门性第一篇&#xff0c;这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析&#xff0c;ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。 二、ECA原理分析 ECA官方论文地址&#xff1a;ECA文章 ECA的pytorch版代码&#xff1a;ECA的…

大数据最新面试题(持续更新)

2024大数据面试题 什么是Hbase&#xff1f;它与Hadoop的关系是什么&#xff1f; Hbase是一个开源的分布式数据库&#xff0c;基于Hadoop的HDFS&#xff0c;用于大数据存储和处理。它提供了高性能的读写能力和可扩展性。 Hbase的架构是什么&#xff1f; Hbase的架构由Region…

前端面试CSS常见题目

1. CSS 选择器的优先级 (Specificity) 面试官通常会问你如何计算 CSS 选择器的优先级&#xff0c;这对于避免样式冲突、提高代码可维护性很重要。 优先级计算规则&#xff1a; !important 优先级最高。内联样式&#xff08;例如&#xff1a;<div style"color: red;&…

go语言 数组和切片

Array(数组)定义数组数组的长度多维数组切片&#xff08;slice&#xff09;切片的基本概念切片的定义从数组创建切片从数组创建切片注意 如何不受限地通过数组创建切片 使用内置函数 make 创建切片使用字面量创建切片判断切片是否为空1. 检查切片的长度2. 检查切片是否为nil空切…

【C++】——继承详解

目录 1、继承的概念与意义 2、继承的使用 2.1继承的定义及语法 2.2基类与派生类间的转换 2.3继承中的作用域 2.4派生类的默认成员函数 <1>构造函数 <2>拷贝构造函数 <3>赋值重载函数 <4析构函数 <5>总结 3、继承与友元 4、继承与静态变…

JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)

大家好&#xff0c;今天我要分享的是如何在树形结构的数据中&#xff0c;根据特定条件设置节点及其所有子节点的显示属性。在实际项目中&#xff0c;这种需求非常常见&#xff0c;特别是在需要动态展示和隐藏节点的情况下。下面我将通过一个具体的示例来讲解实现过程。 需求分析…