【leetcode】473. Matchsticks to Square
2024-09-05 19:35:15
题目如下:
解题思路:居然把卖火柴的小女孩都搬出来了。题目的意思是输入一个数组,判断能否把数组分成四个子数组,使得每个子数组的和相等。首先我们可以很容易的求出每个子数组的和应该是avg = sum(nums)/4,接下来我的思路是求出nums中所有和等于avg的子数组,子数组中保存元素下标,然后找出四个不存在相同下标的子数组求并集,如果并集长度刚好等于len(nums),那么就是符合条件的,返回true。如果在子数组列表中找到四个符合条件的子数组,我用的是DFS,为什么不用BFS?因为题目要求是找到一组符合条件的子数组即可,DFS显然要比BFS快。
代码如下:
class Solution(object):
def makesquare(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
nums.sort()
border = 4
if sum(nums)%border != 0 :
return False
avg = sum(nums)/border
queue = [[x] for x in xrange(len(nums))]
res = []
visit = [0 for x in xrange(len(nums))]
while len(queue) > 0:
nl = queue.pop(0)
amount = 0
for i in nl:
amount += nums[i]
if amount == avg:
res.append(nl)
for i in nl:
visit[i] = 1
continue
tl = []
for i in xrange(nl[-1]+1,len(nums)):
if amount + nums[i] <= avg:
tl = nl[:]
tl.append(i)
queue.append(tl)
if len(res) < border:
return False
if sum(visit) != len(visit):
return False
queue = []
for i in res:
queue.append((set(i),1))
#print queue
while len(queue) > 0:
ns,count = queue.pop(0)
if count == border and len(ns) == len(nums):
#print ns
return True
for i in res:
#print ns | set(i)
if len(ns | set(i)) == len(ns) + len(i):
queue.insert(0,(ns|set(i),count+1)) return False
最新文章
- Git add 常见用法
- BZOJ4297 : [PA2015]Rozstaw szyn
- JSP 相关试题(一)
- 浅谈HAL
- 【AngularJs】---";Error: [ng:areq] Argument &#39;fn&#39; is not a function, got undefined";
- zoj 3209.Treasure Map(DLX精确覆盖)
- mybatia的mypper.xml文件,参数类型为map,map里有一个键值对的值为数组,如何解析,例子可供参考,接上文,发现更简便的方法,不必传数组,只需传字符串用逗号隔开即可
- 真正实现Netty私有协议开发
- 跨域访问解决方案:JSONP
- Oracle 12C 新特性之非分区表转分区表online clause(不停业务+索引有效)
- SpringBoot整合SpringCloud搭建分布式应用
- TreeView 节点拖拽
- MyBatis工具类
- pytorch torchvision.ImageFolder的使用
- Codeforces 939C - Convenient For Everybody
- Sublime Text3自定义全部字体大小、字体类型和背景颜色
- ES6 Promise 异步操作
- zabbix准备:nginx安装
- modelform save
- [转]TCP滑动窗口详解