[LeetCode周赛复盘] 第 361 场周赛20230906

news2024/11/24 19:32:47

[LeetCode周赛复盘] 第 361 场周赛20230906

    • 一、本周周赛总结
    • 2843. 统计对称整数的数目
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 2844. 生成特殊数字的最少操作
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 2845. 统计趣味子数组的数目
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 2846. 边权重均等查询
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 参考链接

一、本周周赛总结

  • 幸好上周练习了倍增,否则T4就垮了。
  • T1 数位DP。
  • T2 贪心。
  • T3 同余+前缀和计数。
  • T4 树上前缀和+lca。
    在这里插入图片描述

2843. 统计对称整数的数目

2843. 统计对称整数的数目

1. 题目描述

在这里插入图片描述

2. 思路分析

这个数据范围实际上可以枚举。
  • 当困难题用数位DP做,可以达到log2high。
  • 注意,两边的和可以合并成一个diff,如果不合并就是立方复杂度。
  • 递归时,只需要多传递一个填数起始点,就可以计算出这个数的长度,以及填数时是算左边还是右边。
  • 另外,这种high-low的以后一律写减法,尽量不考虑一个dfs同时搞上下界,思维量大很多。

3. 代码实现

class Solution:
    def countSymmetricIntegers(self, low: int, high: int) -> int:

        def f(s):
            n = len(s)
            @cache
            def f(i,p,st,is_limit):  # i,(suml-sumr),数字起点位置(代替is_num)
                if p<0:return 0
                if i == n:
                    return int(st!=-1 and p == 0)
                ans = 0 
                if st==-1:
                    ans += f(i+1,p,-1,False)
                if st != -1 or (n-i)%2 == 0:  # 只有偶数长度有意义
                    up = int(s[i]) if is_limit else 9
                    down = 1 if st==-1 else 0
                    if st == -1:
                        st = i
                    mid = st+(n-st)//2
                    d = 1 if i < mid else -1
                    for j in range(down,up+1):                   
                        ans += f(i+1,p+j*d,st,is_limit and up == j)
                return ans 
            return f(0,0,-1,True)
        return f(str(high)) - f(str(low-1))

2844. 生成特殊数字的最少操作

2844. 生成特殊数字的最少操作

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 能被25整除的数字,末两位一定是 00,25,50,75。
  • 那么从末尾依次找这几个字符即可,能找到第二个字符,就是途经的长度-1。
  • 另外,如果都没找到,至少可以把除了0的全删除,变成0也视为合法,即删除n-count(0)个。

3. 代码实现

class Solution:
    def minimumOperations(self, num: str) -> int:
        n = len(num)
        num = num[::-1]
        five = zero = -1
        for i,v in enumerate(num):
            if v == '5':
                if zero != -1:
                    return i - 1
                five = i
            elif v == '0':
                if zero != -1:
                    return i-1
                zero = i 
            elif v == '2' or v == '7':
                if five != -1:
                    return i-1 

        return n - num.count('0')

2845. 统计趣味子数组的数目

2845. 统计趣味子数组的数目

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 典题,同余计数。
  • 第一个条件可以看成nums全是01,那么题目变成问有多少子段,和 ≡ k(% mod)。
  • 那么可以用前缀和+计数,假设当前右端点和为s,需求s-x = k,变化得x = s-k。
  • 即它可以和所有(s-k)%mod的左端点组合,只需记录每个前缀和数量。

3. 代码实现

class Solution:
    def countInterestingSubarrays(self, nums: List[int], modulo: int, k: int) -> int:
        n = len(nums)
        a = [int(v%modulo==k) for v in nums]
        # cnt = [1]+[0]*n  # re 下标范围应该是module不是n
        cnt = Counter([0])
        s = ans = 0 
        for v in a:
            s += v 
            ans += cnt[(s-k)%modulo]
            cnt[s%modulo] += 1
        return ans

2846. 边权重均等查询

2846. 边权重均等查询

1. 题目描述

在这里插入图片描述
在这里插入图片描述

2. 思路分析

  • 设一条长为a的路径上最多的权出现b次,那么修改次数就是a-b。则本题转化成:求任意路径的长度和边权最大频次。
  • 看到边权值域只有26,考虑在值域上暴力计数。
  • 如何求子段上的一条路径贡献呢,如果是一维数组我们通常考虑前缀和。这里是树,也是可以的。
  • 有了快速计算子段的方法,还要考虑树的特殊计算方法。
  • 两个点可能分别在两个子树里,可以画图思考一下。
  • 计算时则可以先求出lca,画图发现:如果u是v的祖先,则可以套用普通的前缀和(祖先可以用lca==u来判断);否则,是两边加起来,再减去两次lca的前缀和;而第二种其实包含了第一种。

3. 代码实现

class Solution:
    def minOperationsQueries(self, n: int, edges: List[List[int]], queries: List[List[int]]) -> List[int]:
        g = [[] for _ in range(n)]
        for u,v,w in edges:
            g[v].append((u,w))
            g[u].append((v,w))
        m = n.bit_length()
        pa = [[-1]*m for _ in range(n)]
        pre=[[0]*27 for _ in range(n)]
        s = [0]*27
        depth = [0]*n
        def dfs(u,fa,ww):
            s[ww] += 1
            pre[u] = s[:]                                
            pa[u][0] = fa 
            for v,w in g[u]:
                if v == fa:continue 
                depth[v] = depth[u] + 1
                dfs(v,u,w)
            s[ww] -= 1 
        dfs(0,-1,0)
        for j in range(m-1):
            for i in range(n):
                p = pa[i][j]
                pa[i][j+1] = pa[p][j]

        def get_kth_ancestor(u,k):
            for i in range(k.bit_length()):
                if k>>i&1:
                    u = pa[u][i]
            return u
        def get_lca(u,v):
            if depth[u] > depth[v]:
                u,v = v,u 
            v = get_kth_ancestor(v,depth[v]-depth[u])
            if u == v:
                return u 
            for j in range(m-1,-1,-1):
                pu,pv = pa[u][j],pa[v][j]
                if pu != pv:
                    u,v = pu,pv 
            return pa[u][0]
        ans = []
        # for u,v in queries:
        #     p = [0]*27
        #     if depth[u] > depth[v]:
        #         u,v = v,u
        #     lca = get_lca(u,v)
        #     if lca == u:
        #         for i,(x,y) in enumerate(zip(pre[u],pre[v])):
        #             p[i] += y-x
        #     else:                
        #         for i,(x,y,z) in enumerate(zip(pre[u],pre[v],pre[lca])):
        #             p[i] += y+x-2*z
        #     p[0] = 0 
        #     ans.append(sum(p)-max(p))
        for u,v in queries:
            p = [0]*27           
            lca = get_lca(u,v)
            for i,(x,y,z) in enumerate(zip(pre[u],pre[v],pre[lca])):
                p[i] += y+x-2*z
            
            ans.append(sum(p)-max(p))
        return ans    

参考链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升客户体验,你只需要做到这一点

自动回复是指由特定事件或操作触发的自动响应&#xff0c;例如在即时通讯工具上接收消息&#xff0c;它用于通知发件人他们的消息已被收到。不仅可以在WhatsApp&#xff0c;Messenger等渠道上设置自动回复&#xff0c;如果您使用了像SaleSmartly&#xff08;SS客服&#xff09;…

任意文件读取及漏洞复现

文章目录 渗透测试漏洞原理任意文件读取1. 任意文件读取概述1.1 漏洞成因1.2 漏洞危害1.3 漏洞分类1.4 任意文件读取1.4.1 文件读取1.4.2 任意文件读取1.4.3 权限问题 1.5 任意文件下载1.5.1 一般情况1.5.2 PHP实现1.5.3 任意文件下载 2. 任意文件读取攻防2.1 路径过滤2.1.1 过…

无需麻烦验证,文字验证码一键通过

前言 文字验证码&#xff0c;简单易用&#xff0c;安全可靠&#xff01;不需要麻烦的图形识别。这种验证方式不仅方便快捷&#xff0c;而且能有效防止恶意攻击和机器人访问。无需担心复杂操作&#xff0c;只需几秒钟就能完成验证过程。保护您的个人信息和数据安全&#xff0c;…

PG 的状态机和peering过程

首先来解释下什么是pg peering过程&#xff1f; 当最初建立PG之后&#xff0c;那么需要同步这个pg上所有osd中的pg状态。在这个同步状态的过程叫做peering过程。同样当启动osd的时候&#xff0c;这个osd上所有的pg都要进行peering过程&#xff0c;同步pg的状态。peering过程结…

【K 均值聚类】02/5:简介

一、说明 k-mean算法是一种聚类算法&#xff0c;它的主要思想是基于数据点之间的距离进行聚类。K-means聚类是一种无监督的机器学习算法。让我们再解释一下这句话。聚类分析的目标是将数据划分为同类聚类。每个聚类中的点彼此之间比其他聚类中的点更相似。 无监督机器学习是在没…

k8s集群中集群方式安装nacos

1、前提条件 一个k8s集群&#xff0c;其中有三个master 节点&#xff0c;这三个节点的标签名称为etcd 三个master节点的ip 分别为&#xff1a;192.165.187.170 、192.165.187.171、192.165.187.172一个mysql 数据库&#xff0c; 数据库的ip 为&#xff1a;192.165.187.180 用户…

Java虚拟机整型数加载指令学习

JVM中 int 类型数值&#xff0c;根据 取值范围将 入栈的 字节码指令 就分为4类&#xff1a; 取值 -1~5 采用 iconst 指令&#xff1b; 取值 -128~127 采用 bipush 指令&#xff1b; 取值 -32768~32767 采用 sipush指令&#xff1b; 取值 -2147483648~2147483647 采用 ldc 指令。…

pyppeteer模块常用方法

目录 await page.方法 设置相关 setUserAgent(str) setCookie&#xff08;cookie1, cookie2.......&#xff09; 页面相关 goto(url) reload() goBack()/goForward() 执行js evaluate(js_str) 截图 screenshot(dict) 保存pdf pdf(dict) 获取内容 content() co…

Fragment的创建分析

之前的文章讨论了Fragment的销毁流程&#xff0c;初始状态为resume&#xff0c;然后经历pause -> stop -> destroyView -> destroy -> detach这么几个流程&#xff08;本篇文章基于Support27.1.1来分析的&#xff09;。清楚了Fragment的销毁&#xff0c;那也来看看…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3架构升级

架构升级 GPU 支持 早在 Milvus 1.x 版本,我们就曾经支持过 GPU,但在 2.x 版本中由于切换成了分布式架构,同时出于对于成本方面的考虑,暂时未加入 GPU 支持。在 Milvus 2.0 发布后的一年多时间里,Milvus 社区对 GPU 的呼声越来越高,再加上 NVIDIA 工程师的大力配合——为…

CTFHUB ICS(1)

1.异常的工程文件 把文件拖到kali里面去了 unzip 文件名解压文件 文件很多&#xff0c;我们先进到解压的文件夹里面 strings $(find . | xargs) | grep flag linux命令的作用是在当前目录及子目录下递归查找文件,提取文件中的字符串,然后用grep过滤 find . - 在当前目录及递…

cadence virtuoso bandgap温漂公式

先仿真温漂&#xff0c;然后将曲线send to calculate。 调用ymax&#xff0c;ymin&#xff0c;average函数。

PGInfo核心字段详解

PGInfo存在于PG的整个生命周期中&#xff0c;其在对象数据的写入、数据恢复、PG Peering过程中均发挥重要的作用。本章试图研究pg info在整个PG生命周期中的变化过程&#xff0c;从而对PG及PGInfo有一个更深入的理解。 class PG : DoutPrefixProvider { public:// pg statepg_…

Unable to remove Temporary User Data

错误截图 原因 项目的临时数据目录是存在了未授权的盘符&#xff0c;当删除它的时候&#xff0c;遇到了权限问题&#xff0c;没有权限没法删除。 解决方法 增加字段&#xff1a;userDataDir 解决

WSL使用技巧 / 虚拟机对比

WSL使用技巧 / 虚拟机对比 前言虚拟机比较VMware使用技巧WSL使用技巧官方文档工具安装WSL基本命令运行命令关闭卸载磁盘管理导入导出指定安装路径 前言 本文介绍了VMware和WSL的区别&#xff0c;并详细介绍了WSL的使用方法和技巧。 虚拟机比较 VMware 比较灵活&#xff0c;拥…

高压放大器该如何选择(高压放大器选型要求有哪些)

选择适合的高压放大器对于电子设备和实验中的特定应用非常重要。高压放大器通常用于放大高电压信号&#xff0c;如激光驱动、粒子加速器、电力系统和医学成像等领域。在选择高压放大器时&#xff0c;以下几个因素值得考虑。 首先&#xff0c;您需要确定所需的输出电压范围。不同…

Date.toLocaleString()不同系统语言之会返回不同的format(可能导致我查的出来数据别人查不出来)

最近发生了个Bug,访问部署在服务器上的服务&#xff0c;我选了时间之后查的出来数据&#xff0c;别人就不行&#xff0c;同样的条件&#xff0c;同样的时区。百思不得解。 直到看了 request里面的参数&#xff0c;发现怎么format不一致&#xff0c;都是访问的服务器部署的服务。…

Linux下的系统编程——进程的执行与回收(八)

前言&#xff1a; 前面我们对进程已经有了一个初步的了解与认识&#xff0c;现在让我们学习一下进程中一些函数的具体使用&#xff0c;比如exec可以执行一些指定的程序&#xff0c;wait / waitpid可以回收子进程&#xff0c;什么是孤儿进程&#xff0c;什么是僵尸进程&#xf…

性能测试实现天罗地网对各个中间件实现监控

名师出高徒&#xff0c;我亲自带你出征&#xff0c;直捣黄龙。高手都是顶峰相见&#xff01;将军有剑 不斩苍蝇&#xff0c;将军赶路&#xff0c;不追小兔。赶紧上车 带你入行就是高手。

【ccf-csp题解】第1次csp认证-第三题-命令行选项-题解

题目描述 思路讲解 本题是一个简单的字符串模拟题&#xff0c;这种题目是csp认证第三题的常客 大致思路是用两个bool数组记录某一个选项&#xff08;0--25下标对应小写字母a--z&#xff09;&#xff0c;第一个数组中无参选项为true&#xff0c;第二个数组中有参选项为true&a…