首页 > 其他分享 >LeetCode题练习与总结:灯泡开关--319

LeetCode题练习与总结:灯泡开关--319

时间:2024-10-18 23:20:45浏览次数:3  
标签:319 -- 复杂度 平方 灯泡 因数 循环 关闭 LeetCode

一、题目描述

初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭第二个。

第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换第 i 个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。

找出并返回 n 轮后有多少个亮着的灯泡。

示例 1:

输入:n = 3
输出:1 
解释:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 

你应该返回 1,因为只有一个灯泡还亮着。

示例 2:

输入:n = 0
输出:0

示例 3:

输入:n = 1
输出:1

提示:

  • 0 <= n <= 10^9

二、解题思路

  1. 分析规律:观察每一轮灯泡的状态变化,可以发现,一个灯泡的状态变化次数取决于它的编号有多少个不同的因数。例如,编号为6的灯泡,在第1轮、第2轮、第3轮和第6轮会被切换,因为6有4个因数(1, 2, 3, 6)。如果一个灯泡的编号有奇数个因数,那么它最终会是亮着的;如果有偶数个因数,那么它最终会是关闭的。

  2. 数学规律:一个数的因数通常是成对出现的,除了完全平方数。例如,4的因数有1、2、4,其中2出现了两次。因此,一个数如果是一个完全平方数,那么它就有奇数个因数。

  3. 结论:经过n轮后,亮着的灯泡数量等于不大于n的完全平方数的数量。

基于以上思路,我们可以直接计算不大于n的完全平方数的数量,即计算从1到n的每个数,判断它是否是完全平方数。

三、具体代码

class Solution {
    public int bulbSwitch(int n) {
        // 初始化亮着的灯泡数量
        int count = 0;
        // 从1开始,计算每个数的平方,直到平方数大于n
        for (int i = 1; i * i <= n; i++) {
            count++;
        }
        return count;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度

该算法中,我们有一个循环,循环的条件是 i * i <= n。这意味着循环将执行直到 i 的平方大于 n。换句话说,循环将执行大约 sqrt(n) 次,因为 i 的值将从 1 增长到 sqrt(n)

因此,该算法的时间复杂度是 O(√n)。

2. 空间复杂度

该算法中,我们使用了一个整型变量 count 来计数亮着的灯泡数量,以及一个整型变量 i 作为循环的迭代器。这两个变量都是常数空间,不随输入 n 的大小而变化。

因此,算法的空间复杂度是 O(1),表示算法使用了固定数量的额外空间。

五、总结知识点

  1. 类定义(Class Definition):代码中定义了一个名为 Solution 的类,这是面向对象编程的基础。

  2. 方法定义(Method Definition):在 Solution 类中定义了一个公共方法 bulbSwitch,它接受一个整数参数 n 并返回一个整数,这是函数式编程的一个特点。

  3. 变量声明与初始化(Variable Declaration and Initialization):使用 int count = 0; 声明并初始化了一个整型变量 count,用于计数。

  4. 循环结构(Loop Structure):使用了一个 for 循环,这是控制流语句的一种,用于重复执行代码块。

  5. 算术运算(Arithmetic Operations):在循环条件中使用了乘法运算符 * 来计算 i 的平方,并与 n 进行比较。

  6. 逻辑运算(Logical Operations):循环条件 i * i <= n 使用了小于等于 (<=) 的逻辑运算符来确定循环的继续条件。

  7. 增量运算(Increment Operation):在 for 循环的末尾,使用 i++ 对变量 i 进行自增操作,这是常见的编程技巧。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:319,--,复杂度,平方,灯泡,因数,循环,关闭,LeetCode
From: https://blog.csdn.net/weixin_62860386/article/details/142992313

相关文章

  • C语言练习
    题目:1.编写一段C语言,使之像下面这样交替显示+和-,总个数等于所输入的整数值。另外当输入0以下的整数时,则什么也不显示。正整数:13【】+-+-+-+-+-+-+分析:1.首先题目要求交替显示,所以这表明了要筛选,所以我们可以用嵌套循环完成它(至于什么是嵌套循环,请看往期知识点)    ......
  • 使用飞浆ai训练yolov5
    使用飞浆ai训练yolov5飞浆ai创建项目安装环境数据集训练在yolov5目录下创建一个data.yaml,可改名因为包安装不在python的路径下,需要在py文件中添加如下命令可以导入包的位置然后可以再终端中执行训练命令参数:训练结束预测数据参数最简单的检测命令创新、修改飞浆ai......
  • HashMap优点总结及源码分析
    HashMap优点总结:可存储不同类型的数据:使用泛型来定义键和值的类型,兼容所有数据类型高效的查找和插入操作:通过key的hash映射,实现快速的查找和插入操作。时间复杂度基本为O(1)灵活的容量调整:可根据数据量增长自行动态扩容。当容量过大时,HashMap会自动进行缩容,从而提高空间利......
  • python火柴人毕业设计
    1.引言火柴人(StickFigure)是一种极简风格的图形,通常由简单的线段和圆圈组成,却能生动地表达人物的姿态和动作。火柴人不仅广泛应用于动画、漫画和涂鸦中,还可以作为图形学、人工智能等领域的教学和研究工具。本文旨在介绍如何使用Python实现火柴人的设计与绘制,通过编程的方式,让读者......
  • 一文了解大模型中的SDK和API
    大白话聊SDK和API-知乎1.智谱AI的SDK和API以智谱AI为例,智谱AI的SDK是名为zhipuai的Python包,其中包含了用于访问API的接口(如api-key)。在这个框架中,API是SDK的一部分,用于实现与智谱AI服务的交互。2.LangChain的SDK和APILangChain的SDK是一个包/框架,允许开发者使用不同大......
  • 【AI学习】Mamba学习(八):HiPPO通用框架定义和方法
    在大概了解了《HiPPO通用框架介绍》后,继续看HiPPO通用框架的相关定义和方法。相关内容在论文《HiPPO:RecurrentMemorywithOptimalPolynomialProjections》的第二章描述。2TheHiPPOFramework:High-orderPolynomialProjectionOperators作者将投影作为学习记忆......
  • 【AI学习】Mamba学习(七):HiPPO通用框架介绍
    HiPPO这篇论文《HiPPO:RecurrentMemorywithOptimalPolynomialProjections》,提出了一个通用框架。我们再重新看一下论文的摘要:从连续数据中学习的一个核心问题是,随着更多数据的处理,以增量方式表示累积历史。我们介绍了一个通用框架(HiPPO),用于通过投影到多项式基上对连......
  • 判断语句的编织艺术
    判断语句一、什么是判断?判断在生活中如何体现?判断就是通过选择最后得到不同的结果判断在我们的日常生活中无处不在。例如:天气判断:早上出门前,我们会判断今天是否需要带伞。如果天气预报显示会下雨,我们会选择带伞;如果显示晴天,我们可能选择不带伞。程序:我有20块钱,有两个......
  • 查理·芒格:渴望一夜暴富是相当危险的
    巴菲特曾说:“芒格设计了今天的伯克希尔哈撒韦,这是他最重要的成就。他给我的蓝图很简单,即‘用划算的价格投资一家优秀企业,比以便宜的价格买入一家普通企业的结果要好得多……’就这样,伯克希尔哈撒韦按照芒格的蓝图建立起来了。我的角色是总承包商,而伯克希尔哈撒韦下属公司的首席......
  • 《安全边际》卡拉曼:市场波动对我们反而有利
    如果说起Baupost这家机构,或许你没有听过它的名字,但你一定知道《安全边际》这本书。这本书的作者塞斯·卡拉曼,正是Baupost的创始人。卡拉曼有着“波士顿先知”之称,他强调安全边际,被外界称为“半仓打天下”,同时偏好寻找受挫资产。1982年,25岁的卡拉曼联合创立波士顿对冲基金......