LeetCode每日一题:319. 灯泡开关【2021/11/15】

353 阅读1分钟

题目链接:319. 灯泡开关 - 力扣(LeetCode) (leetcode-cn.com)

难度:Medium

这题很有意思。

对于灯泡 ii,它的最终状态取决于 ii 的因子个数,因子个数为奇数时,最终为开灯状态。所以该题可以转化为:求小于等于 nn 的正整数中,因子个数为奇数的的数量。

对于整数 kk,因子个数为 nn,因子集合为 {F1...Fn2...Fn}\{F_1...F_{ \frac{ \lfloor n \rfloor }{2} }...F_n\},如果因子个数为奇数,则有 Fn2Fn2=kF_{ \frac{ \lfloor n \rfloor }{2} }*F_{ \frac{ \lfloor n \rfloor }{2} } = k, F1Fn=F2Fn1=...=Fn2Fn2=kF_1*F_n= F_2*F_{n-1}=... = F_{ \frac{ \lfloor n \rfloor }{2} }*F_{ \frac{ \lfloor n \rfloor }{2} } = k。则 kk 一定是一个完全平方数。所以该题可以转化为:求小于等于 nn 的完全平方数的个数。

接下来求小于等于 nn 的完全平方数的个数。

观察到完全平方数序列 12,22,32,42...m21^2, 2^2, 3^2, 4^2...m^2,其中 m2n(m+1)2m^2\leq n\leq(m+1)^2,很容易得出小于等于 m2m^2 的完全平方数的个数是 mm 个,即 n\lfloor \sqrt{n} \rfloor

class Solution {
public:
    int bulbSwitch(int n) {
        return sqrt(n);
    }
};