LeetCode 每日一题 2024/4/15-2024/4/21

news/2024/10/21 7:50:44/

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步


目录

      • 4/15 706. 设计哈希映射
      • 4/16 924. 尽量减少恶意软件的传播
      • 4/17 928. 尽量减少恶意软件的传播 II
      • 4/18 2007. 从双倍数组中还原原数组
      • 4/19 1883. 准时抵达会议现场的最小跳过休息次数
      • 4/20 39. 组合总和
      • 4/21 216. 组合总和 III


4/15 706. 设计哈希映射

用数组代替

class MyHashMap(object):def __init__(self):self.l = [""]*(10**6+1)def put(self, key, value):""":type key: int:type value: int:rtype: None"""self.l[key]=valuedef get(self, key):""":type key: int:rtype: int"""return self.l[key] if self.l[key]!="" else -1def remove(self, key):""":type key: int:rtype: None"""self.l[key]=""

4/16 924. 尽量减少恶意软件的传播

节点只有300个 枚举每一个连通网络中的节点个数
net[node]=x 记录节点node属于第x个网络
cnt[node]=num 记录节点node所属网络包含num个节点
将initial从小到大依次考虑
cur[net]记录当前net网络中恶意软件的数目
如果某一个网络中恶意软件数目超过1个
那么删除其中一个并不会对结果产生影响
只有当网络中有且仅有一个恶意软件时 删除它会减小感染数量

def minMalwareSpread(graph, initial):""":type graph: List[List[int]]:type initial: List[int]:rtype: int"""n = len(graph)net = {}netnum = 0cnt = {}initial.sort()mem = {}for i in range(n):if i in mem:continuecur = {}l = [i]num = 1mem[i]=1cur[i]=1while l:tmp = []for node in l:for j,v in enumerate(graph[node]):if v==0 or j==node or j in mem:continuemem[j]=1cur[j]=1num+=1tmp.append(j)l=tmpfor node in cur:cnt[node] = numnet[node] = netnumnetnum+=1cur={}for node in initial:nodenet = net[node]cur[nodenet] = cur.get(nodenet,0)+1ans = initial[0]maxnum = 0for node in initial:if cur[net[node]]==1 and cnt[node]>maxnum:maxnum = cnt[node]ans = nodereturn ans

4/17 928. 尽量减少恶意软件的传播 II

300个点 遍历每种情况
注意是从initial中去除一个 不是所有的点
直接遍历initial中所有点 使用bfs 计算每一种情况下的感染个数 取最小的位置

def minMalwareSpread(graph, initial):""":type graph: List[List[int]]:type initial: List[int]:rtype: int"""N = len(graph)link = {}for i in range(N):link[i] = [x for x in range(N) if graph[i][x]==1]res=-1mincount= 99999if not initial:return 0initial.sort()def bfs(pos):query = initial[:]query.remove(pos)visit = {x:0 for x in range(N)}visit[pos]=1ret = len(query)while query:x = query.pop(0)for next in link[x]:if visit[next]==0 and graph[x][next]==1:query.append(next)visit[next]=1ret+=1return retfor i in initial:ans = bfs(i)if ans<mincount:mincount = ansres = ireturn res

4/18 2007. 从双倍数组中还原原数组

从小到大考虑
s中存放需要出现的双倍数值
如果当前num没有在s中 那么说明属于原数组
将双倍数值加入到s中

def findOriginalArray(changed):""":type changed: List[int]:rtype: List[int]"""n = len(changed)if n%2==1:return []changed.sort()s = {}ans = []for num in changed:if s.get(num,0)>0:s[num]-=1if s[num]==0:del s[num]else:ans.append(num)s[num*2] = s.get(2*num,0)+1return ans if len(ans)==n//2 else []

4/19 1883. 准时抵达会议现场的最小跳过休息次数

如果每次都跳过休息还是无法抵达 则说明不能到达
定义dfs(i,j) 最多跳i次情况下,从0到j的最小时间
分跳过和不跳过两个情况
如果不跳过则为前一个的最小时间加上当前需要时间 向上取整
如果跳过 为上一个位置最小时间加上当前时间
两种情况取最小值

def minSkips(dist, speed, hoursBefore):""":type dist: List[int]:type speed: int:type hoursBefore: int:rtype: int"""n=len(dist)if sum(dist)>speed*hoursBefore:return -1mem = {}def dfs(i,j):if (i,j)in mem:return mem[(i,j)]if j<0:return 0ans = (dfs(i,j-1)+dist[j]+speed-1)//speed*speedif i:ans = min(ans,dfs(i-1,j-1)+dist[j])mem[(i,j)]=ansreturn ansfor i in range(n+1):if dfs(i,n-2)+dist[-1]<=speed*hoursBefore:return i

4/20 39. 组合总和

递归
按顺序排序 记录使用过的位置loc 防止继续取到前面的数造成重复

def combinationSum(candidates, target):""":type candidates: List[int]:type target: int:rtype: List[List[int]]"""candidates = sorted(candidates)ret = []def dfs(v,loc,l):if v==0:ret.append(l)returnfor i in range(loc,len(candidates)):c = candidates[i]tmp = l[:]if c>v:returntmp.append(c)dfs(v-c,i,tmp)dfs(target,0,[])return ret

4/21 216. 组合总和 III

从小打大考虑
l记录当前可用数组
now记录当前已经选中的数
v为还需要的数值
k为需要挑选的数值个数
选中一个数c之后
接下来考虑k-1个数凑成v-c

def combinationSum3(k, n):""":type k: int:type n: int:rtype: List[List[int]]"""l = [i for i in range(1,10)]ret =[]def dfs(v,k,l,now):if (k<=0 and v>0) or (k>0 and v<=0):returnif k==0 and v==0:ret.append(now)for i in range(len(l)):c = l[i]if c>v:returndfs(v-c,k-1,l[i+1:],now+[c])dfs(n,k,l,[])return ret


http://www.ppmy.cn/news/1427690.html

相关文章

0-1背包问题:贪心算法与动态规划的比较

0-1背包问题&#xff1a;贪心算法与动态规划的比较 1. 问题描述2. 贪心算法2.1 贪心策略2.2 伪代码 3. 动态规划3.1 动态规划策略3.2 伪代码 4. C语言实现5. 算法分析6. 结论7. 参考文献 1. 问题描述 0-1背包问题是组合优化中的一个经典问题。假设有一个小偷在抢劫时发现了n个…

JS-29-Promise对象

一、JavaScript的异步操作 在JavaScript的世界中&#xff0c;所有代码都是单线程执行的。 由于这个“缺陷”&#xff0c;导致JavaScript的所有网络操作&#xff0c;浏览器事件&#xff0c;都必须是异步执行。异步执行可以用回调函数实现&#xff1a; function callback() {c…

4.18学习总结

多线程补充 等待唤醒机制 现在有两条线程在运行&#xff0c;其中一条线程可以创造一个特殊的数据供另一条线程使用&#xff0c;但这个数据的创建也有要求&#xff1a;在同一时间只允许有一个这样的特殊数据&#xff0c;那么我们要怎样去完成呢&#xff1f;如果用普通的多线程…

友思特应用 | 红外视角的延伸:短波红外相机的机器视觉应用

导读 短波红外SWIR在不同波段针对不同材料的独特成像特征为各领域检测应用的拓宽提供了基础。本文将展现短波红外成像技术在水分检测、塑料检测、太阳能电池板检查和矿场开采等领域的丰富应用案例&#xff0c;讨论短波红外相机在未来的发展方向。 SWIR 背景简介 短波红外 &am…

实战:通用二进制格式安装 MySQL(mysql-5.7.29)-2024.4.6(测试成功)

目录 文章目录 目录实验环境下载url安装相关包准备用户准备二进制程序准备环境变量准备配置文件生成数据库文件,并提取root密码准备服务脚本和启动修改口令测试登录安全初始化&#xff08;可选&#xff09;shell一键安装关于我最后 实验环境 mysql-5.7.29 centos7.6 1810软件位…

高频前端面试题汇总之Vue篇

1. Vue的基本原理 当一个Vue实例创建时&#xff0c;Vue会遍历data中的属性&#xff0c;用 Object.defineProperty&#xff08;vue3.0使用proxy &#xff09;将它们转为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访问和修改时通知变化。 每个组件实…

Linux 安装 Docker +Docker Compose + cucker/get_command_4_run_container

TIP&#xff1a;下面演示的 Linux 系统为 CentOS 7.9。 Docker 更新你的系统并安装必要的依赖项&#xff1a; sudo yum update -y sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加 Docker 的官方仓库&#xff1a; sudo yum-config-manager --add-rep…

es安装中文分词器

下载地址&#xff0c;尽量选择和自己本地es差不多的版本 https://github.com/infinilabs/analysis-ik/releases 下载好&#xff0c;解压&#xff0c;把里面的文件放到es的plugins/ik目录下 把plugin-descriptor.properties文件里的es版本改成自己对应的 再启动es&#xff0c;能…