题目描述

现有一个房间,墙上挂有 只已经打开的灯泡和 个按钮。在进行了 次未知操作后,你需要返回这 只灯泡可能有多少种不同的状态。

假设这 只灯泡被编号为 ,这 个按钮的功能如下:

  • 将所有灯泡的状态反转(即开变为关,关变为开)
  • 将编号为偶数的灯泡的状态反转
  • 将编号为奇数的灯泡的状态反转
  • 将编号为 的灯泡的状态反转()

示例1

        输入:
n = 1, m = 1.
输出:
2
解释:
状态为: [开], [关]

示例2

        输入:
n = 2, m = 1.
输出:
3
解释:
状态为: [开, 关], [关, 开], [关, 关]

示例3

        输入:
n = 3, m = 1.
输出:
4
解释:
状态为: [关, 开, 关], [开, 关, 开], [关, 关, 关], [关, 开, 开].

提示

  • 都属于 .

题解

首先我们要知道,一个操作做两次就等于没做,所以一个操作只有没做做了两种状态,也就是说有效操作数量最多 次:

然后我们观察每一个操作对灯状态(初始都开着,状态都为 )的影响:

  • 操作 个灯状态就要反转一次,也就是灯的状态按照周期 重复(与 异或)。
  • 操作 个灯状态就要反转一次,也就是灯的状态按照周期 重复(与 异或)。
  • 操作 个灯状态就要反转一次,也就是灯的状态按照周期 重复(与 异或)。
  • 操作 个灯状态就要反转一次,也就是灯的状态按照周期 重复(与 异或)。

综上,我们只需要取周期的最小公倍数 就行了。也就是只需要看前 盏灯的最终状态,就能唯一确定后面所有灯的最终状态

形式化表示,用 表示第 个操作是否用过。那么对于第 盏灯来说,它的最终状态可以表示为:

由此可以推出: ,也就是灯的最终状态以 为周期。

到此其实可以直接暴力枚举 的所有状态了,但是还是有优化空间的。

如果我们列出前 盏灯的状态:

我们可以看出,如果前 盏灯状态确定了,可以唯一确定出后 盏灯状态。因此,我们只需要计算前 盏灯有多少种状态就行了。

最终经过枚举计算():

  • 如果 ,那么就只有 种状态(灯都开着)。
  • 否则如果 ,那么有 种状态。
  • 否则如果 ,若 ,就有 种状态;若 ,就有 种状态。
  • 否则如果 ,若 ,就有 种状态;若 ,就有 种状态;若 ,就有 种状态。

如果你实在不想手动计算,那你可以枚举所有的 种操作状态,然后保存前三盏灯的状态到一个集合中,最终输出集合大小就行了。

代码

c++

        class Solution {public:int flipLights(int n, int m) {if (m == 0) return 1;if (n == 1) return 2;m = min(m, 3);if (n == 2) return vector<int>{3, 4, 4}[m-1];return vector<int>{4, 7, 8}[m-1];}
};

python

        class Solution:def flipLights(self, n: int, m: int) -> int:if m == 0: return 1if n == 1: return 2m = min(m, 3)if n == 2: return [3, 4, 4][m-1]return [4, 7, 8][m-1]

python(枚举)

        class Solution:def flipLights(self, n, m):seen = set()for cand in itertools.product((0, 1), repeat = 4):if sum(cand) % 2 == m % 2 and sum(cand) <= m:A = []for i in range(min(n, 3)):light = 1light ^= cand[0]light ^= cand[1] and i % 2light ^= cand[2] and i % 2 == 0light ^= cand[3] and i % 3 == 0A.append(light)seen.add(tuple(A))return len(seen)

【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ相关推荐

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

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

  2. java回文数算法for_【Java】【每日算法/刷穿 LeetCode】9. 回文数(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]9. 回文数(简单) 宫水三叶发布于 今天 15:30 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从 ...

  3. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

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

    [LeetCode]灯泡开关Ⅰ~ Ⅳ

  5. 整数反转leetcode java_【Java】【每日算法/刷穿 LeetCode】7. 整数反转(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]7. 整数反转(简单) 宫水三叶发布于 今天 12:10 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...

  6. java编写字母z算法_【Java】【每日算法/刷穿 LeetCode】6. Z 字形变换(中等)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]6. Z 字形变换(中等) 宫水三叶发布于 今天 12:03 题目描述 将一个给定字符串 s 根据给定的行数 numRows , ...

  7. java 最长回文_【Java】【每日算法/刷穿 LeetCode】5. 最长回文子串(中等)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]5. 最长回文子串(中等) 宫水三叶发布于 今天 12:00 题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 ...

  8. LeetCode 5353. 灯泡开关 III

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

  9. 【每日算法/刷穿 LeetCode】25. K 个一组翻转链表(困难)

    题目描述 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例: ...

  10. leetcode - 22 672. 灯泡开关 Ⅱ

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

最新文章

  1. doc es 中type_Elasticsearch(024):es常见的字段映射类型之 连接类型(join type)
  2. boost::int64_t模块int64 范围的测试程序
  3. 如何优化电子邮件营销的效果
  4. linux用于查看文件内容 tail、cat、more、less、head 、sed 命令
  5. 亚信安全发布2021年挖矿病毒专题报告,聚焦挖矿病毒进化与治理
  6. 2019年网络安全状况_知道吗,如何加强个人的网络安全状况?
  7. java script eval_java ScriptEngine 使用 (支持JavaScript脚本,eval()函数等)
  8. uva 820 Internet Bandwidth
  9. 算法入门——排序算法
  10. mui(APP)全屏展示
  11. LoRa网关的特点及应用
  12. win7磁盘管理分区,改变页面文件卷,删除卷就由灰变黑了!
  13. GJM : AlloyTouch实战--60行代码搞定QQ看点资料卡
  14. 该怎么选择便宜和贵的SSL证书
  15. JavaScript 日期处理类库 --- Moment.js
  16. Golang--Go语言 五百行后台代码实现一简约的个人博客网站-TinyBlog
  17. windows安装RabbitMQ以及Erlang
  18. linux内核是干什么,linux内核开发工程师
  19. python12306源码_春运了,Python大神分享爬取12306车票信息的例子,附抢票源码
  20. 高品质免费字体集锦:25款英文艺术字体下载

热门文章

  1. 系统如何删除被其它进程占用的文件?
  2. 使用.NET框架自带的Json序列化类
  3. 20175312 2018-2019-2 实验五 网络编程与安全 实验报告
  4. 萌新接触前端的第三课——JavaScript
  5. 两个对象值同样(x.equals(y) == true),但却可有不同的hash code,这句话对不正确?
  6. php 之 json格式
  7. Application page and Site page
  8. Vertx与Spring配合完成DML操作
  9. 项目设计与范围管理(笔记)
  10. CodeIgniter 框架的安装