leetcode 燈泡開關問題

 

public static int bulbSwitch(int n) {
        int num = 1;


        //暴力求解方法超時
//        int[] bulb = new int[n];
//
//
//        for(int i = 1 ; i <= n ; i++){
//            if(i == 1){
//                for(int j = 0 ; j < n ; j++)
//                    bulb[j] = 1;
//                num = n;
//            }else if(i == 2){
//                for(int k = 0 ; k < n ; k++){
//                    if(k % 2 == 1){
//                        bulb[k] = -1;
//                        num--;
//                    }
//                }
//            }else {
//                for(int l = 0 ; l < n ; l++){
//                    if(l % i == i - 1){
//                        bulb[l] = -bulb[l];
//                        if(bulb[l] == 1)
//                            num++;
//                        else
//                            num--;
//                    }
//                }
//            }
//        }





        //第k盞燈亮暗情況爲k輪下來燈泡反轉的次數
        //爲 1 ~ K 中  K 的因子個數 偶數時爲暗 奇數爲亮
        //由於 K / i = j(整除關係) 所以 i 和 j 都爲 K 的因子 如 K / 1 = K
        //所以可以知道 K 的因子總是成對存在的
        //但有一種情況 即 K / i = j 且 i = j 時 K 的因子只有一個 即 i = j
        //綜合上面說的兩種情況 只有存在 i = j 時K 在 1 ~ K 裏面的因子數爲奇數 不存在則爲偶數
        //所以問題被轉換爲 K 是否可以被開根號(開根號後爲整數)
        //即 第K盞燈能被開根號 K輪後就爲亮的
        //轉換爲 1 ~ K 中有多少個整數能被開根號就有多少個亮的燈
        //實際上我們可發現((√K)+1)*((√K)+1) > K 而 ((√K)-i)*((√K)-i) < K
        //所以我們可以知道 √K 之前 有 √K 個數可以被開根號
        //如 K = 9  √K = 3 那麼1 ~ K 中能被開根號的數都在 1 * 1 , 2 * 2 , 3 * 3
        //因爲 4 * 4 > 9 不在 1 ~ K 的範圍內 所以4不行
        //最終我們要求的實際上就是 return Math.sqrt(K);


        if(n == 0 )
            return 0;


        for(int i = 2 ; i <= n ; i++){
            int s = (int)Math.sqrt(i);
            if( s * s == i )
                num++;
        }


        return num;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章