【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ
题目描述
现有一个房间,墙上挂有 只已经打开的灯泡和 个按钮。在进行了 次未知操作后,你需要返回这 只灯泡可能有多少种不同的状态。
假设这 只灯泡被编号为 ,这 个按钮的功能如下:
- 将所有灯泡的状态反转(即开变为关,关变为开)
- 将编号为偶数的灯泡的状态反转
- 将编号为奇数的灯泡的状态反转
- 将编号为 的灯泡的状态反转()
示例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. 灯泡开关 Ⅱ相关推荐
- LeetCode 672. 灯泡开关 Ⅱ(枚举)
1. 题目 现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮. 在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态. 假设这 n 只灯泡被编号为 [1, 2, 3 - ...
- java回文数算法for_【Java】【每日算法/刷穿 LeetCode】9. 回文数(简单)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]9. 回文数(简单) 宫水三叶发布于 今天 15:30 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从 ...
- 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符
题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...
- 【LeetCode】灯泡开关Ⅰ~ Ⅳ(你还是把我关了吧)
[LeetCode]灯泡开关Ⅰ~ Ⅳ
- 整数反转leetcode java_【Java】【每日算法/刷穿 LeetCode】7. 整数反转(简单)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]7. 整数反转(简单) 宫水三叶发布于 今天 12:10 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...
- java编写字母z算法_【Java】【每日算法/刷穿 LeetCode】6. Z 字形变换(中等)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]6. Z 字形变换(中等) 宫水三叶发布于 今天 12:03 题目描述 将一个给定字符串 s 根据给定的行数 numRows , ...
- java 最长回文_【Java】【每日算法/刷穿 LeetCode】5. 最长回文子串(中等)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]5. 最长回文子串(中等) 宫水三叶发布于 今天 12:00 题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 ...
- LeetCode 5353. 灯泡开关 III
5353. 灯泡开关 III 房间中有 n 枚灯泡,编号从 1 到 n,自左向右排成一排.最初,所有的灯都是关着的. 在 k 时刻( k 的取值范围是 0 到 n - 1),我们打开 light[k ...
- 【每日算法/刷穿 LeetCode】25. K 个一组翻转链表(困难)
题目描述 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例: ...
- leetcode - 22 672. 灯泡开关 Ⅱ
房间中有 n 只已经打开的灯泡,编号从 1 到 n .墙上挂着 4 个开关 . 这 4 个开关各自都具有不同的功能,其中: 开关 1 :反转当前所有灯的状态(即开变为关,关变为开) 开关 2 :反转编 ...
最新文章
- doc es 中type_Elasticsearch(024):es常见的字段映射类型之 连接类型(join type)
- boost::int64_t模块int64 范围的测试程序
- 如何优化电子邮件营销的效果
- linux用于查看文件内容 tail、cat、more、less、head 、sed 命令
- 亚信安全发布2021年挖矿病毒专题报告,聚焦挖矿病毒进化与治理
- 2019年网络安全状况_知道吗,如何加强个人的网络安全状况?
- java script eval_java ScriptEngine 使用 (支持JavaScript脚本,eval()函数等)
- uva 820 Internet Bandwidth
- 算法入门——排序算法
- mui(APP)全屏展示
- LoRa网关的特点及应用
- win7磁盘管理分区,改变页面文件卷,删除卷就由灰变黑了!
- GJM : AlloyTouch实战--60行代码搞定QQ看点资料卡
- 该怎么选择便宜和贵的SSL证书
- JavaScript 日期处理类库 --- Moment.js
- Golang--Go语言 五百行后台代码实现一简约的个人博客网站-TinyBlog
- windows安装RabbitMQ以及Erlang
- linux内核是干什么,linux内核开发工程师
- python12306源码_春运了,Python大神分享爬取12306车票信息的例子,附抢票源码
- 高品质免费字体集锦:25款英文艺术字体下载
热门文章
- 系统如何删除被其它进程占用的文件?
- 使用.NET框架自带的Json序列化类
- 20175312 2018-2019-2 实验五 网络编程与安全 实验报告
- 萌新接触前端的第三课——JavaScript
- 两个对象值同样(x.equals(y) == true),但却可有不同的hash code,这句话对不正确?
- php 之 json格式
- Application page and Site page
- Vertx与Spring配合完成DML操作
- 项目设计与范围管理(笔记)
- CodeIgniter 框架的安装