LeetCode 319. Bulb Switcher 解题报告
题目描述
There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it’s off or turning off if it’s on). For the ith round, you toggle every i bulb. For the nth round, you only toggle the last bulb. Find how many bulbs are on after n rounds.
示例
限制条件
没有明确给出.
解题思路
我的思路:
这道题我觉得蛮简单的,因为我花了大概10分钟,用了4行代码就给Accept了。可能是因为我想的思路刚好是对的,所以下面讲讲我的整个思维过程。
首先观察题目给的例子,结合题意,很自然就能想到,一个开关i被拨动的次数就是i的约数的个数,比如第8个开关,它被拨动了4次,分别在
轮数=1,2,4,8
时,而1,2,4,8就是8的约数。
所以题目就变成了求1-n中每个数
i
的约数个数,统计约数个数是奇数的数目,因为如果约数个数是奇数,则开关是开的。
那么下一步就是求
如果i是完全平方数,那么i的约数个数肯定是奇数,如果i不是完全平方数,由于约数成对出现,所以约数个数肯定是偶数。
想出了这一点,这道题就变成了更简单的题目:计算1-n中完全平方数的数目,到这里就不用我继续讲了吧。
——————华丽的分割线————————–
以上是我10分钟前的想法,然而在这洗澡的10分钟里,我突然想到了小于等于n的平方数的数目就是直接对n的平方根取整数,所以最佳的答案只需一行,直接返回对n的平方根的取整。
代码
我的代码
class Solution {
public:
int bulbSwitch(int n) {
return (int)sqrt(n);
}
};
总结
这道题只要思路想对了,不用几分钟就能做出来,关键是能够一步一步把看似复杂的问题化成更简单的问题。
轻松秒杀这个坑,干其他事去了,每天坚持填坑!加油加油!