码迷,mamicode.com
首页 > 其他好文 > 详细

Bulb Switcher

时间:2017-08-10 01:09:39      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:时间复杂度   tab   时间   ble   没有   style   tco   stat   man   

2017年8月9日 23:03:14

Description:

There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it‘s off or turning off if it‘s on). For the ith round, you toggle every i bulb. For the nth round, you only toggle the last bulb. Find how many bulbs are on after n rounds.

大概是这个意思:

2015盏灯,一开始全部熄灭,序号分别是1-2015,先把1的倍数序号的灯的开关全部按一次,然后把2的倍数的灯的开关全部按一次,然后把3的倍数的开关按一次,以此类推,最后把2015的倍数灯的开关按一次。问最后亮着的灯有多少盏?

下面是我的解题代码:

static int GetResult(int n)
        {
            int[] lights = new int[n];
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= n; j++)
                {
                    if (j % i == 0 && i % 2 != 0)
                    {
                        lights[j - 1] = lights[j - 1] == 0 ? 1 : 0;
                    }
                    else if (j % i == 0 && i % 2 == 0)
                    {
                        lights[j - 1] = lights[j - 1] == 1 ? 0 : 1;
                    }
                }
            }
            int num = 0;
            for (int i = 0; i < n; i++)
            {
                if (lights[i] == 1)
                    num += 1;
            }
            return num;
        }

程序在测试的时候是没有什么问题的,但是在提交到LeetCode的时候提示失败,测试数字为99999;

因为程序的时间复杂度是O(n^2),所以当数字为99999的时候获取结果时间过长。

后来看了一下别人的解题思路:求1-2015中约数个数为奇数个的数!而只有平方数才有奇数个约数。

1 2 3 4 5 6 ... 43 44 45
1^2 2^2 3^2 4^2 5^2 6^2 ... 43^2 44^2 45^2
2 4 9 16 25 36 ... 1849 1936 2025

 

从上表可以看出n中有根号n个平方数,所以:

static int GetResult(int n)
        {
            return (int)Math.Sqrt(n);
        }

这才是正确的姿势。

Bulb Switcher

标签:时间复杂度   tab   时间   ble   没有   style   tco   stat   man   

原文地址:http://www.cnblogs.com/yh2015/p/7334607.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!