1. 程式人生 > >[Leetcode] 第319題 燈泡開關

[Leetcode] 第319題 燈泡開關

一、題目描述

初始時有 個燈泡關閉。 第 1 輪,你開啟所有的燈泡。 第 2 輪,每兩個燈泡你關閉一次。 第 3 輪,每三個燈泡切換一次開關(如果關閉則開啟,如果開啟則關閉)。第 i 輪,每 個燈泡切換一次開關。 對於第 輪,你只切換最後一個燈泡的開關。 找出 輪後有多少個亮著的燈泡。

示例:

輸入: 3
輸出: 1 
解釋: 
初始時, 燈泡狀態 [關閉, 關閉, 關閉].
第一輪後, 燈泡狀態 [開啟, 開啟, 開啟].
第二輪後, 燈泡狀態 [開啟, 關閉, 開啟].
第三輪後, 燈泡狀態 [開啟, 關閉, 關閉]. 

你應該返回 1,因為只有一個燈泡還亮著。

二、題目解析

1)這個問題關鍵在於理解題意和找出規律

2)其實就是每i個燈泡切換一次;用一個大小為n的陣列,把所有過程跑一遍;這樣會超時

3)發現規律,i*i~(i+1)*(i+1)有i個

三、程式碼

class Solution {
public:
    int bulbSwitch(int n) {
        /*if (!n)return 0;
        vector<int>v(n, 1);
        for (int i = 2; i <= n; ++i) {
            for (int j = 1; i*j <= n; ++j) {
                if (v[i*j-1] == 1)
                    v[i*j - 1] = 0;
                else v[i*j - 1] = 1;
            }
        }
        int res = 0;
        for (int i = 0; i < n; ++i)
            res += v[i];
*/ int res = sqrt(n); return res; } };