房间中有 n 只已经打开的灯泡,编号从 1 到 n 。墙上挂着 4 个开关 。

这 4 个开关各自都具有不同的功能,其中:

开关 1 :反转当前所有灯的状态(即开变为关,关变为开) 开关 2 :反转编号为偶数的灯的状态(即 2, 4, …) 开关 3
:反转编号为奇数的灯的状态(即 1, 3, …) 开关 4 :反转编号为 j = 3k + 1 的灯的状态,其中 k = 0, 1,
2, …(即 1, 4, 7, 10, …) 你必须 恰好 按压开关 presses 次。每次按压,你都需要从 4
个开关中选出一个来执行按压操作。

给你两个整数 n 和 presses ,执行完所有按压之后,返回 不同可能状态 的数量。

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/bulb-switcher-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 提示:

1 <= n <= 1000 0 <= presses <= 1000

一开始写了一个最简单的未剪枝的dfs方法梳理思路

class Solution:def flipLights(self, n: int, presses: int) -> int:if presses==0:return 1ans = set()def flip_1(state):for id, num in enumerate(state):state[id] = "1" if state[id] == "0" else "0"# print(state)return "".join(state)def flip_2(state):for id, num in enumerate(state):if id%2 == 1:state[id] = "1" if state[id] == "0" else "0"# print(state)return "".join(state)def flip_3(state):for id, num in enumerate(state):if id%2 == 0:state[id] = "1" if state[id] == "0" else "0"# print(state)return "".join(state)def flip_4(state):for id, num in enumerate(state):if id%3 == 0:state[id] = "1" if state[id] == "0" else "0"# print(state)return "".join(state)def flips(states, press):nonlocal ansstate = list(states)if press == 1:ans.add(flip_1(state))ans.add(flip_2(state))ans.add(flip_3(state))ans.add(flip_4(state))else:flips(flip_1(state), press-1)flips(flip_2(state), press-1)flips(flip_3(state), press-1)flips(flip_4(state), press-1)flips("0"*n, presses)return len(ans)

时间复杂度:O(4presses4^{presses}4presses)

空间复杂度:O(4n4^n4n)

明显可以看出在n和presses最高,可以达到1000时,是完全超时的,因此需要找到更简单的剪枝。
记四个操作分别为flip1到flip4,各类操作形成的符号串为flipi∗flipj⋯∗flipkflipi*flipj\cdots*flipkflipi∗flipj⋯∗flipk。我们很容易注意到 flip2和flip3是可交换的操作。因此经过仔细观察引申出来,所有的flip对于结果来说都是可交换的,因此我们只需要考虑∏i1+i2+i3+i4=processes(flip1)i1(flip2)i2(flip3)i3(flip4)i4\prod \limits_{i_1+i_2+i_3+i_4=processes} (flip1)^{i_1}(flip2)^{i_2}(flip3)^{i_3}(flip4)^{i_4}i1​+i2​+i3​+i4​=processes∏​(flip1)i1​(flip2)i2​(flip3)i3​(flip4)i4​的形式即可,又因为按钮操作本质上是一个可逆操作,其逆为本身,因此只需要关注iki_kik​的奇偶性即可,因此形式转化为∏i1+i2+i3+i4=processes(flip1)i1%2(flip2)i2%2(flip3)i3%2(flip4)i4%2\prod \limits_{i_1+i_2+i_3+i_4=processes} (flip1)^{i_1\%2}(flip2)^{i_2\%2}(flip3)^{i_3\%2}(flip4)^{i_4\%2}i1​+i2​+i3​+i4​=processes∏​(flip1)i1​%2(flip2)i2​%2(flip3)i3​%2(flip4)i4​%2 而flip2∗flip3=flip1flip2*flip3=flip1flip2∗flip3=flip1
因此我们得到最多只有8中情况,列出对应情况即可,为O(1)复杂度

class Solution:def flipLights(self, n: int, presses: int) -> int:if presses == 0:return 1if n > 2:if presses == 1:return 4if presses == 2:return 6 + 1if presses == 3:return 4 + 4 if presses == 4:return 6 + 2return comb(4, 2) + 2elif n == 2:if presses == 1:return 3 if presses == 2:return 3 + 1if presses == 3:return 3 + 1return 4return 2

leetcode - 22 672. 灯泡开关 Ⅱ相关推荐

  1. C/C++描述 LeetCode周赛 5473. 灯泡开关 IV

    5473. 灯泡开关 IV   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博 ...

  2. LeetCode 672. 灯泡开关 Ⅱ(枚举)

    1. 题目 现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮. 在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态. 假设这 n 只灯泡被编号为 [1, 2, 3 - ...

  3. 【Java】672. 灯泡开关 Ⅱ

    房间中有 n 只已经打开的灯泡,编号从 1 到 n .墙上挂着 4 个开关 . 这 4 个开关各自都具有不同的功能,其中: 开关 1 :反转当前所有灯的状态(即开变为关,关变为开) 开关 2 :反转编 ...

  4. leetcode,脑筋急转弯,灯泡开关问题

    题目 初始时有 n 个灯泡关闭. 第 1 轮,你打开所有的灯泡. 第 2 轮,每两个灯泡你关闭一次. 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭).第 i 轮,每 i 个灯泡切 ...

  5. 【LeetCode】灯泡开关Ⅰ~ Ⅳ(你还是把我关了吧)

    [LeetCode]灯泡开关Ⅰ~ Ⅳ

  6. LeetCode(319):灯泡开关 Bulb Switcher(Java)

    2019.8.6 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) 每个数i必能分解成任意两个数的乘积(最少会有1*i),因此只有平方数会进行单次开关,因此只需要统计截止n的平方 ...

  7. LeetCode 5353. 灯泡开关 III

    5353. 灯泡开关 III 房间中有 n 枚灯泡,编号从 1 到 n,自左向右排成一排.最初,所有的灯都是关着的. 在 k  时刻( k 的取值范围是 0 到 n - 1),我们打开 light[k ...

  8. 20200308: 生成每种字符都是奇数个的字符串灯泡开关 III(leetcode5352-5353)

    生成每种字符都是奇数个的字符串&灯泡开关 III 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 第一题没什么难度,StringBuilder拼接即可 第二题一开始想复杂了,用了Ha ...

  9. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

最新文章

  1. 架构设计的真谛:系统与子系统、模块与组件、框架与架构
  2. Swift2.0语言教程之下标脚本
  3. 【推荐】极简数独1.0源码
  4. 创建自定义验证控件(1)
  5. chromebook刷机_如何在Chromebook上切换(或离开)Canary频道
  6. mysql与mssql中datetime类型字段问题_excel数据存入sqlserver过程中,遇到Datetime的格式问题。...
  7. 估值指标方法20190805
  8. asp .net 多文件上传(二)
  9. java 裁剪 pdf_Java 合并、拆分PDF文档
  10. Android开机速度优化 Android 开机时间优化
  11. AI First:互联网进步的背后,反映出的是流量的再分配
  12. ubuntu GRUB 引导加载 Beini(WiFi破解神器) Tiny Core Linux
  13. 通过Teardrop学习网络通信编程
  14. const定义及初始化约束
  15. CANopen COB-ID 使能PDO功能
  16. HDU 4069 Squiggly Sudoku DLX 精确覆盖
  17. 常见的分词方法接口+ jieba自定义领域内的词表然后加载词表进行分词
  18. 【Accumulation】The definition of SISR
  19. 游戏进阶之千里之行始于足下(一)
  20. HDOJ2955 Robberies(01背包,概率)

热门文章

  1. Error:A JNI error has occurred,please check your installation and try again
  2. Nacos服务健康监测
  3. SpringMVC入门上机实验,基于SpringMVC数据绑定的学生成绩信息管理
  4. AI 加持实时互动|ZegoAvatar 面部表情随动技术解析
  5. oa系统 云服务器配置,oa系统云服务器配置
  6. Linux 挂载Samba 设置777权限及取消挂载
  7. 部件mscomctl_mscomctl.ocx下载_mscomctl.ocx官方下载【32位64位】-太平洋下载中心
  8. FFT快速傅里叶变换 超详细的入门学习总结
  9. AcWing 2048. 干草
  10. 数据可视化和可视化分析:你能看到数据世界