LeetCode 每日一题 2022/7/25-2022/7/31
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 7/25 919. 完全二叉树插入器
- 7/26 1206. 设计跳表
- 7/27 592. 分数加减运算
- 7/28 1331. 数组序号转换
- 7/29 593. 有效的正方形
- 7/30 952. 按公因数计算最大组件大小
- 7/31 1161. 最大层内元素和
7/25 919. 完全二叉树插入器
将节点放入队列中
从位置0算起 第i个位置节点的子节点位置为(i+1)*2-1 (i+1)*2
位置i的父节点为(i-1)//2 如果i为偶数为右子节点 i为奇数为左子节点
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right
class CBTInserter(object):def __init__(self, root):""":type root: TreeNode"""self.root = rootself.li = []l = [root]while l:tmp = []for node in l:if node.left:tmp.append(node.left)if node.right:tmp.append(node.right)self.li.append(node)l = tmp[:]def insert(self, val):""":type val: int:rtype: int"""node = TreeNode(val)loc = len(self.li)+1preloc = (loc-1)//2pre = self.li[preloc]if loc%2==1:pre.left = nodeelse:pre.right = nodeself.li.append(node)return pre.valdef get_root(self):""":rtype: TreeNode"""return self.root
7/26 1206. 设计跳表
参考 https://leetcode.cn/problems/design-skiplist/solution/she-ji-tiao-biao-by-leetcode-solution-e8yh/
将每个数字看作一个节点 节点最多有MAX_LEVAL层
如果对于某一层 该节点存在 则该位置指向下一个存在的节点
random_level 随机决定该节点层数
import random
MAX_LEVAL = 32
PRO = 0.25
def random_level():lv = 1while lv<MAX_LEVAL and random.random()<PRO:lv+=1return lvclass Node:__slots__ = ['val','forward']def __init__(self,val,maxlev=MAX_LEVAL):self.val = valself.forward = [None]*maxlevclass Skiplist(object):def __init__(self):self.head = Node(-1)self.level = 0def search(self, target):""":type target: int:rtype: bool"""cur = self.headfor i in range(self.level-1,-1,-1):while cur.forward[i] and cur.forward[i].val<target:cur = cur.forward[i]cur = cur.forward[0]if cur and cur.val==target:return Truereturn Falsedef add(self, num):""":type num: int:rtype: None"""new = [self.head]*MAX_LEVALcur = self.headfor i in range(self.level-1,-1,-1):while cur.forward[i] and cur.forward[i].val<num:cur = cur.forward[i]new[i] = curlv = random_level()self.level = max(self.level,lv)newnode = Node(num,lv)for i in range(lv):newnode.forward[i] = new[i].forward[i]new[i].forward[i] = newnodedef erase(self, num):""":type num: int:rtype: bool"""new = [self.head]*MAX_LEVALcur = self.headfor i in range(self.level-1,-1,-1):while cur.forward[i] and cur.forward[i].val<num:cur = cur.forward[i]new[i] = curcur = cur.forward[0]if not cur or cur.val!=num:return Falsefor i in range(self.level):if new[i].forward[i]!=cur:breaknew[i].forward[i] = cur.forward[i]while self.level>1 and not self.head.forward[self.level-1]:self.level-=1return True
7/27 592. 分数加减运算
分别提取出分子和分母
将不同的分母求乘积total 同时变化分子
将分子求和 并将和的结果与分母乘积辗转相除求最大公因数化简
def fractionAddition(expression):""":type expression: str:rtype: str"""fenzi = []fenmu = []cur = ""s = set()for c in expression:if c in ["+","-"]:if cur!="":fenmu.append(int(cur))s.add(int(cur))cur = celif c =="/":fenzi.append(int(cur))cur = ""else:cur+=cfenmu.append(int(cur))s.add(int(cur))total = 1for v in s:total *= vfor i in range(len(fenmu)):fenzi[i] *= total//fenmu[i]num = sum(fenzi)ans =""if num<0:ans = "-"num = -numif num==0:return "0/1"x,y = total,numwhile x%y>0:x,y = y,x%y total //=ynum //=yans += str(num)+"/"+str(total)return ans
7/28 1331. 数组序号转换
def arrayRankTransform(arr):""":type arr: List[int]:rtype: List[int]"""l = sorted(arr)m = {}num = 1print(l)for i,v in enumerate(l):if i>0 and l[i-1]<v:num +=1m[v] = numans = [0]*len(arr)for i,v in enumerate(arr):ans[i] = m[v]return ans
7/29 593. 有效的正方形
考虑点重叠情况
dis计算a,b点之间的线的平方
任选三个点 得到三条边
构成等边直角三角形
需要存在两条边相等=bian 两条边平方等于另一条边平方
如果存在可以确定直角顶点ding 和斜边两个点
第四个点与斜边两点连接的两条边长度 也需要等于bian
同时与顶点连接长度等于斜边
def validSquare(p1, p2, p3, p4):""":type p1: List[int]:type p2: List[int]:type p3: List[int]:type p4: List[int]:rtype: bool"""if p1==p2 or p3==p4:return Falsedef dis(a,b):return (a[0]-b[0])**2+(a[1]-b[1])**2points = []ding = []a = dis(p1,p2)b = dis(p2,p3)c = dis(p3,p1)bian = 0if a==b and a+b==c:bian = apoints = [p1,p3]ding = p2elif a==c and a+c==b:bian = apoints = [p2,p3]ding = p1elif b==c and b+c==a:bian = bpoints = [p1,p2]ding = p3else:return Falseif dis(p4,ding)!=2*bian:return Falsefor p in points:l = dis(p4,p)if l!=bian:return Falsereturn True
7/30 952. 按公因数计算最大组件大小
并查集 将num和其因数归为一组
遍历nums的每个num
找到num所有质因数
将其与其质因数划分为一组
class UnionFind:def __init__(self, n):self.parent = list(range(n))self.rank = [0] * ndef find(self, x):if self.parent[x] != x:self.parent[x] = self.find(self.parent[x])return self.parent[x]def union(self, x, y):x, y = self.find(x), self.find(y)if x == y:returnif self.rank[x] > self.rank[y]:self.parent[y] = xelif self.rank[x] < self.rank[y]:self.parent[x] = yelse:self.parent[y] = xself.rank[x] += 1def largestComponentSize(nums):""":type nums: List[int]:rtype: int"""from collections import Countern = max(nums)+1uf = UnionFind(n)for num in nums:tmp = numi = 2while i*i<=tmp:if tmp%i==0:while tmp%i==0:tmp //=iuf.union(num,i)i+=1if tmp>1:uf.union(num,tmp)return max(Counter(uf.find(x) for x in nums).values())
7/31 1161. 最大层内元素和
BFS 按层遍历
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef maxLevelSum(root):""":type root: TreeNode:rtype: int"""lel = 1maxv = float("-inf")l = [root]ans = 0while l:tmp = []total = 0for node in l:total += node.valif node.left:tmp.append(node.left)if node.right:tmp.append(node.right)if maxv<total:ans = lelmaxv = totall = tmplel+=1return ans
LeetCode 每日一题 2022/7/25-2022/7/31相关推荐
- Leetcode 每日一题双题版(2.25+2.24)模拟练细节
Leetcode 每日一题双题版(2.25+2.24)模拟练细节 前言 刚刚敲了今天刷新的题目,然后昨天的也写了,就想着更新一下blog 两道题都是模拟题,对于模拟,我的看法就是看懂题目,拿捏细节,难 ...
- leetcode每日刷题计划-简单篇day8
leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...
- Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)
思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...
- 【LeetCode每日一题】1723. 完成所有工作的最短时间
[LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...
- leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用
leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...
- LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色
LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...
- 【LeetCode每日一题】——109.有序链表转换二叉搜索树
文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...
- leetcode每日一题·救生艇问题(Python)
leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...
- LeetCode每日一题——904. 水果成篮
LeetCode每日一题系列 题目:904. 水果成篮 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整 ...
- LeetCode每日一题打卡组队监督!刷题群!
近 2000 人已经加入共同刷题啦! 群友每天都会在群里给大家讲解算法题 每周日「负雪明烛」组织直播讲题 我相信来看我博客的大部分人都是通过LeetCode刷题过来的.最近发现LeetCode中文网站 ...
最新文章
- Spark的RDD转换算子
- ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze 最短路+分层图
- SimpleDateFormat使用详解 转
- 深度学习核心技术精讲100篇(四十六)-情感分析算法在阿里小蜜的应用实践
- 1044 拦截导弹——http://codevs.cn/problem/1044/
- 【Linux】一步一步学Linux——Linux系统常用快捷键(12) 待更新...
- 算法7-10:拓扑排序
- 蓝色中国风传统图案背景素材
- CentOS7没有telnet命令的解决方法
- 设计模式:JavaScript
- mysql 存储过程 高并发_解决数据库高并发常见方案
- windows下namp的基本操作命令
- CAN FD安全通信
- python语言判断中国节假日(pip install chinesecalendar)
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式懒加载
- 未来教育1级计算机基础及ms,未来教育.全国计算机等级考试一本通一级计算机基础及MS Office应用...
- 老男孩python2020年31期学习记录贴
- veket linux安装到硬盘,安装veket到移动硬盘NTFS分区
- oracle 物料属性批次过期,系列之五:ORACLE EBS 系统主数据管理(C)
- git 修改倒数二个 commit
热门文章
- chrome同步书签实现
- Delmia Com二次开发
- error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.28/version: open //./pipe/docker_
- Android地图应用闪退,android 第二次打开场景闪退
- 项目管理中的工具与技术----项目范围管理中的工具与技术
- 11、分布式爬虫(一)
- GIS二维电子地图开发总结
- openGL学习之glut库的使用
- 适合Java零基础小白学习的Java零基础教程
- 机器视觉HALCON软件学习总结