Leetcode题解 - 部分中等难度算法题解(56、957、825、781、1324、816)
957. N 天后的牢房

思路:
模拟变换,当N天结合后返回 => 当N非常大的时候,超时 => 一般N很大的时候,这种题目必然存在循环,所以记录找过的状态,一旦出现已经访问过的状态可立即跳出循环。
class Solution:
def prisonAfterNDays(self, cells, N: int):
vis = []
while 1:
if not N:
return cells
if cells in vis:
ind = vis.index(cells)
break
tcell = cells.copy()
for i in range(len(cells)):
if i == 0 or i == len(cells)-1:
tcell[i] = 0
continue
if cells[i-1] == cells[i+1]:
tcell[i] = 1
else:
tcell[i] = 0
vis.append(cells)
cells = tcell
N -= 1
vis = vis[ind:]
return vis[N % len(vis)]
825. 适龄的朋友

思路:
最直观的就是两层循环暴力,意料之中的超时了。那么就改以人为单位交友,变为以组(年龄相同的为一组)为单位交友。
还需要注意的一点就是15岁以下的没朋友,不符合第一个条件!
from collections import Counter
class Solution:
def numFriendRequests(self, ages) -> int:
ages, res = sorted(Counter(ages).items(), key=lambda x: x[0]), 0
for i in range(len(ages)):
if ages[i][0] < 15:
continue
res += (ages[i][1] - 1) * ages[i][1]
for j in range(i):
if ages[j][0] <= (ages[i][0] * 0.5 + 7):
continue
else:
res += ages[i][1] * ages[j][1]
return res
781. 森林中的兔子


思路:
颜色相同的兔子如果说自己有i个伙伴,那么所有伙伴都出现,该颜色对应的数字最多出现 i+1次 => 通过频率来判断,那些是同样颜色的。
"""
判断某数字出现的频次,数字0特殊处理一下
数字i出现的频次小于等于i+1时,说明大家都是一个色。
大于i+1的时候,就说明还有别的颜色,看是i+1的几倍就 i+1 * ?
"""
import math
from collections import Counter
class Solution:
def numRabbits(self, answers) -> int:
ans, res = Counter(answers), 0
for num, times in ans.items():
if not num:
res += times
else:
if times <= num + 1:
res += num + 1
else:
t = math.ceil(times / (num + 1))
res += t * (num + 1)
return res
1324. 竖直打印单词

思路:
补上空格,矩阵转置输出,末尾的空格需要去掉。
class Solution:
def printVertically(self, s: str):
s = s.split(" ")
l = len(sorted(s, key=lambda x:-len(x))[0])
for i in range(len(s)):
s[i] = s[i] + (l - len(s[i])) * " "
res = []
for i in zip(*s):
i = ("".join(list(i))).rstrip()
res.append(i)
return res
816. 模糊坐标

思路:
分割数组找到整数、小数部分。比较麻烦在于加上小数点后时候合理:
- 不是‘0’也不是'0.'但以0开头的不合理
- 以‘0’结尾的不合理
"""
先分割字符串,得到整数部分和小数部分,再分别为两部分加上小数点,同时判断加上小数点后是否为合理数字
"""
class Solution:
def ambiguousCoordinates(self, S: str):
def produce(string):
res = []
# 本身就是一个完整的数字
if len(str(int(string))) == len(string):
res = [string]
# 如果全是零直接返回
if set(string) == {'0'}:
return res
# 在不同的位置添加小数点
for i in range(1,len(string)):
t = string[:i]+"."+string[i:]
# 不是'0'也不是'0.'开头的,以'0'开头的都要删掉
if len(string[:i]) >= 2 and string[:i].startswith("0"):
continue
# '0'结尾的也删掉
if string[i:].endswith('0'):
continue
res.append(t)
return res
S, res, r = S[1:-1], [], []
# 分割字符串获取整数、小数部分
for i in range(1, len(S)):
res.append((S[:i], S[i:]))
for x, y in res:
px = produce(x)
py = produce(y)
for i in px:
for j in py:
r.append("("+i+", "+j+")")
return r
56. 合并区间

思路:
按照合并的要求来就vans了。先排序,保证遍历的时候后面的要么是头比前面大,要么是尾巴更长。记录当前拼接的头尾,如果遇到了头比当前拼接的尾巴还大,这两个区间不可能合并的,重新开始一次拼接,否则更新尾巴。
class Solution:
def merge(self, intervals):
res = []
# 先排序
intervals = sorted(intervals)
# 记录拼接的首尾大小
s, e = intervals[0][0], intervals[0][1]
for x, y in intervals[1:]:
# 你的头大于我的尾部,不可能拼接的。重新开始一次拼接
if x > e:
res.append([s, e])
s, e = x, y
continue
# 可以拼接到一起,更新尾巴
if y > e:
e = y
if [s, e] not in res:
res.append([s, e])
return res
Leetcode题解 - 部分中等难度算法题解(56、957、825、781、1324、816)的更多相关文章
- Leetcode 12,452,455-贪心算法
Leetcode第12题,整数转罗马数字,难度中等 整个题目比较好理解,难度也不大,就算不过脑子,用一串if也基本上可以解决问题,比如 /** 执行用时:6ms,在所有 Java 提交中击败了52.6 ...
- 每日温度(LeetCode Medium难度算法题)题解
LeetCode 题号739中等难度 每日温度 题目描述: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 ...
- LeetCode 算法题解 js 版 (001 Two Sum)
LeetCode 算法题解 js 版 (001 Two Sum) 两数之和 https://leetcode.com/problems/two-sum/submissions/ https://lee ...
- C#版[击败99.69%的提交] - Leetcode 242. 有效的同构异形词 - 题解
C#版 - Leetcode 242. 有效的同构异形词 - 题解 Leetcode 242.Valid Anagram 在线提交: https://leetcode.com/problems/val ...
- C#版 - Leetcode 504. 七进制数 - 题解
C#版 - Leetcode 504. 七进制数 - 题解 Leetcode 504. Base 7 在线提交: https://leetcode.com/problems/base-7/ 题目描述 ...
- C#版(打败99.28%的提交) - Leetcode 347. Top K Frequent Elements - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- OC语言实现中等难度通讯录
实现中等难度通讯录.需求: 1.定义联系⼈人类Contact.实例变量:姓名(拼⾳音,⾸首字⺟母⼤大写).性别.电话号码. 住址.分组名称.年龄.⽅方法:⾃自定义初始化⽅方法(姓名.电话号码).显⽰示 ...
- LeetCode刷题191203 --回溯算法
虽然不是每天都刷,但还是不想改标题,(手动狗头 题目及解法来自于力扣(LeetCode),传送门. 算法(78): 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: ...
- LeetCode算法题解
1.给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?(181) 解法一:举例说明,为了减少复杂度,就使用八位二进制吧. ...
随机推荐
- JS中使用FormData上传图片
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
- L1-006 连续因子 (20分)
题意分析 题目中已经将意思说的很清楚了,就是输出一个数的最长连续因子的个数,并且输出是哪几个因子相乘.可以将题目从这两个角度进行分析: N为素数时,最长连续因子的个数为1,即它自己. N不为素数时,即 ...
- dfs 序 欧拉序
推荐博客 :https://www.cnblogs.com/stxy-ferryman/p/7741970.html DFS序其实就是一棵树顺次访问的结点的顺序,例如下面这棵树 它的 dfs 序就是 ...
- C# html生成图片保存下载
最近有个需求,需要把内容生成图片,我找到一些资料可以将html页面生成图片并保存下载 下面是简单的实现 1.html页面 @{ Layout = null; } <!DOCTYPE html&g ...
- PowerDesigner配置Oracle数据库反向工程
PowerDesigner配置Oracle数据库反向工程 作者:Jesai 贴吧:软件频道吧 1. 前言: PowerDesigner是Sybase的企业建模和设计解决方案,采用模型驱动方法,将业务与 ...
- Vue 例子
一.简单音乐播放器 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Java入门 - 语言基础 - 13.Character类
原文地址:http://www.work100.net/training/java-character.html 更多教程:光束云 - 免费课程 Character类 序号 文内章节 视频 1 概述 ...
- JVM内存布局及GC知识
一.JVM运行时内存布局 按java 8虚拟机规范的原始表达:(jvm)Run-Time Data Areas, 暂时翻译为"jvm运行时内存布局". 从概念上大致分为6个(逻辑) ...
- Spring Cloud Contract 微服务契约测试
简介 使用场景 主要用于在微服务架构下做CDC(消费者驱动契约)测试.下图展示了多个微服务的调用,如果我们更改了一个模块要如何进行测试呢? 传统的两种测试思路 模拟生产环境部署所有的微服务,然后进行测 ...
- [bzoj3244] [洛谷P1232] [Noi2013] 树的计数
Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...