319. Bulb Switcher的C++解法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musechipin/article/details/85047025

这个题我一开始注意到的是,只有数字含有某因子a的时候才会在第a次操作被改变状态,那么计算这个数字有多少因子,如果是奇数就说明最后的灯是开着的,如果是偶数则是关的。

class Solution {
public:
	int countFactor(int n){
		if (n == 1) return 1;
		int sum = 0;
		for (int i = 1; i<sqrt(n); i++)
			if (n%i == 0) sum = sum + 2;
		if (int(sqrt(n))*int(sqrt(n)) == n) sum++;
		return sum;
	}
	int bulbSwitch(int n) {
		int res = 0;
		for (int i = 1; i <= n; i++)
			if (countFactor(i) % 2 == 1) res++;
		return res;
	}
};

然后这样做会报超出时间复杂度。其实再往深想一步,每个数的因数中前面的数改变了灯泡状态,后面的数又变回去了,等于灯泡的状态没有发生变化,只有完全平方数,开方时只得到一个因数,没有对应其它的状态能将其变回去了,所以灯泡就一直是点亮状态的。所以所有平方数都有这么一个相等的因数对,即所有平方数的灯泡都将会是点亮的状态。

class Solution {
public:
    int bulbSwitch(int n) {
        int res = 1;
        while (res * res <= n) ++res;
        return res - 1;
    }
};

进一步简化:

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

猜你喜欢

转载自blog.csdn.net/musechipin/article/details/85047025