最多可达成的换楼请求数目
题目简介
1601. 最多可达成的换楼请求数目
难度:困难
我们有 n
栋楼,编号从 0
到 n - 1
。每栋楼有若干员工。由于现在是换楼的季节,部分员工想要换一栋楼居住。
给你一个数组 requests
,其中 requests[i] = [fromi, toi]
,表示一个员工请求从编号为 fromi
的楼搬到编号为 toi
的楼。
一开始所有楼都是满的,所以从请求列表中选出的若干个请求是可行的需要满足 每栋楼员工净变化为 0 。意思是每栋楼 离开 的员工数目 等于 该楼 搬入 的员工数数目。比方说 n = 3
且两个员工要离开楼 0
,一个员工要离开楼 1
,一个员工要离开楼 2
,如果该请求列表可行,应该要有两个员工搬入楼 0
,一个员工搬入楼 1
,一个员工搬入楼 2
。
请你从原请求列表中选出若干个请求,使得它们是一个可行的请求列表,并返回所有可行列表中最大请求数目。
示例1:
1 | 输入:n = 5, requests = [[0,1],[1,0],[0,1],[1,2],[2,0],[3,4]] |
示例2:
1 | 输入:n = 3, requests = [[0,0],[1,2],[2,1]] |
解法
时间与内存情况:
首先设requests
的长度为 m
。
本题数据范围很小,n
的范围为 20
,m
的范围为 16
。
所以可以使用穷举法。但需要进行状态压缩。
我们可以使用一个二进制数state
表示当前状态,如果二进制数的第i
位为1
,则表示requests[i]
被选择。这样的话一共有2的m次方
种状态。
枚举所有状态,如果当前状态中二进制位的1
数量小于等于res
值,那么直接continue就可以,无需检查合法性。大于res
则检查合法性,合法则赋值给res
,最后返回res
即可。
代码中bits.OnesCount
作用为检查一个uint
数字中包含有多少个1
,(s >> i) & 1
用于判断s
的第i
位是不是1
。
1 | func maximumRequests(n int, requests [][]int) int { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Chao Pang的个人主页!