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;
    }

猜你喜欢

转载自blog.csdn.net/weixin_41237676/article/details/104792919