美文网首页
LeetCode 319. 灯泡开关

LeetCode 319. 灯泡开关

作者: 风卷晨沙 | 来源:发表于2019-08-28 15:18 被阅读0次

    1、题目

    319. 灯泡开关 - 力扣(LeetCode) https://leetcode-cn.com/problems/bulb-switcher/submissions/

    2、题解

    这道题第一个便是扎扎实实的暴力法,就按照这一步一步的步骤去执行即可。这里的时间复杂度是n^2。超过时间限制。
    第二种解法就是找规律,其实对于找规律这种东西,我觉得我是最不擅长的,通常都是枚举之后去观察规律。这道题既然是要求最终还亮几盏灯,那么我们就对灯的状态进行判断即可。如果灯的状态不再变化,我们便记录下来他的最终状态。由此可得:

    1号灯,最终亮;
    2号灯,最终灭;
    3,灭。
    4,亮。
    5到8,灭。
    9,亮。
    ......

    也就是说,n以内的完全平方数的个数就是亮灯的数量,即等于n^0.5,也就是Math.sprt(n)。如此即可。

    3、代码

    暴力法(超过时间限制)

    class Solution {
            public int bulbSwitch(int n) {
                if(n<=0){
                    return 0;
                }
                //数组用int类型,0是关闭,1是开启。n是轮数,也是灯数。
                int[] lampArray = new int[n];//初始化全是关闭
                //Round 1.开所有的灯
                for (int i = 0; i < n; i++) {
                   lampArray[i]=1;
                }
                int result=n-1;//过了1轮
                if(result<=0){
                    return 1;
                }
                //Round 2,每两个灯泡你关闭一次。
                int nowRound2=0;
                while (nowRound2<n){
                    if(nowRound2%2!=0){//奇数
                        lampArray[nowRound2]=0;//关闭
                    }
                    nowRound2++;
                }
                result--;
                if(result<=0){
                    return 1;
                }
                //Round 3,每3个灯泡你切换一次。3到n都是如此
                //从i开始,每i个切换一次
    
                int condition=3;//从3开始
                while (condition<=n){
                    //执行内部的循环遍历
                    int nowRoundi=0;//最终结果
                    while (nowRoundi<n){
                        if((nowRoundi+1)%condition==0){//1/2/3
                            //切换
                            if(lampArray[nowRoundi]==1){
                                //开->关
                                lampArray[nowRoundi]=0;
                            }else{
                                //关-》开
                                lampArray[nowRoundi]=1;
                            }
                        }
                        nowRoundi++;
                    }
                    //外循环累加
                    condition++;
                }
                //遍历去数一数灯有几个亮
                int num=0;
                for (int i = 0; i < n; i++) {
                    if(lampArray[i]==1){
                        num++;
                    }
                }
                return num;
            }
        }
    

    规律法:

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

    4、执行结果

    暴力法执行结果:


    image.png

    规律法:


    image.png

    相关文章

      网友评论

          本文标题:LeetCode 319. 灯泡开关

          本文链接:https://www.haomeiwen.com/subject/qwnpectx.html