[LeetCode周赛复盘] 第 328 场周赛20230115

news2024/11/14 12:15:44

[LeetCode周赛复盘] 第 328 场周赛20230115

    • 一、本周周赛总结
    • 二、 [Easy] 6291. 数组元素和与数字和的绝对差
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 三、[Medium] 6292. 子矩阵元素加 1
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 四、[Medium] 6293. 统计好子数组的数目
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 五、[Hard] 6294. 最大价值和与最小价值和的差值
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 六、参考链接

一、本周周赛总结

  • 这场质量不错。
  • T1 模拟。
  • T2 二维前缀和/二维树状数组。
  • T3 双指针/滑窗。
  • T4 树形DP/换根DP。
    在这里插入图片描述

二、 [Easy] 6291. 数组元素和与数字和的绝对差

链接: 6291. 数组元素和与数字和的绝对差

1. 题目描述

在这里插入图片描述

2. 思路分析

按题意模拟即可。

3. 代码实现

class Solution:
    def differenceOfSum(self, nums: List[int]) -> int:        
        a = sum(nums)
        b = 0
        for x in nums:
            for i in str(x):
                b += int(i)
        return abs(a-b)

三、[Medium] 6292. 子矩阵元素加 1

链接: 6292. 子矩阵元素加 1

1. 题目描述

在这里插入图片描述

2. 思路分析

这题不会差分吃大亏,套了个一维树状数组TLE。

  • 最后快结束了换一维差分能过。
  • 正确应该是二维最快。
  • 二维树状数组也可以过。

3. 代码实现

class Diff2D:
    """二维差分模板"""
    def __init__(self,g):
        self.m,self.n = len(g),len(g[0])
        # self.mat = [[0+]]+[[0]+r[:] for r in g]
        self.diff = [[0]*(self.n+1) for _ in range(self.m+1)]
    def add(self,x1,y1,x2,y2,v):
        x2 += 1
        y2 += 1
        self.diff[x1][y1] += v
        self.diff[x2][y1] -= v
        self.diff[x1][y2] -= v
        self.diff[x2][y2] += v
    def update(self):
        mat = [[0]*(self.n+1) for _ in range(self.m+1)]
        d = self.diff
        for i,row in enumerate(d[:-1]):
            for j,v in enumerate(row[:-1]):
                mat[i+1][j+1] = v - mat[i][j] + mat[i+1][j] + mat[i][j+1] 
        return [r[1:] for r in mat[1:]]

class Solution:
    def rangeAddQueries(self, n: int, queries: List[List[int]]) -> List[List[int]]:
        grid = [[0] * n for _ in range(n)]
        g = Diff2D(grid)
        for x1, y1, x2, y2 in queries:
            g.add(x1, y1, x2, y2 , 1)
        
        return g.update()

四、[Medium] 6293. 统计好子数组的数目

链接: 6293. 统计好子数组的数目

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 滑窗/双指针。
  • 正难则反,显然坏子数组用滑窗更容易计算。
  • 长度为n的数组,子段共n*(n+1)//2个,不断减去坏子数组的个数即可。

3. 代码实现

class Solution:
    def countGood(self, nums: List[int], k: int) -> int:
        n = len(nums)
        ans = n*(n+1)//2
        q = deque()
        c = Counter()
        p = 0
        for v in nums:
            q.append(v)
            c[v] += 1
            p += c[v]-1
            while p >= k:
                l = q.popleft()
                c[l] -= 1
                p -= c[l]
            ans -= len(q)
        return ans

五、[Hard] 6294. 最大价值和与最小价值和的差值

链接: 6294. 最大价值和与最小价值和的差值

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 比赛时写了一个麻烦的树形DP,先求出每个子树最高和次高、节点深度。然后进行第二次dfs更新答案。
  • 赛后抄题解区一个换根DP,思路类似,但更清晰。
  • 定义f[i][0/1/2]代表:i向下走最大路径和,向下走次大路径和,向上走最大路径和;答案一定在向下或向上走的路径中.

  • 灵神用了更快的解法,一次遍历,类似树的直径那种一次树形DP。
  • 由于最大路径和一定存在于某颗子树的两条最大路径上,计算这两条,加起来即可。
  • 由于只做了一次dfs,注意用两个变量储存之前查过的,然后用当前更新答案即可。

3. 代码实现

换根DP

class Solution:
    def maxOutput(self, n: int, edges: List[List[int]], price: List[int]) -> int:
        g = [[] for _ in range(n)]
        for u,v in edges:
            g[u].append(v)
            g[v].append(u)
            # print(u,v)
        ans = 0

        f = [[0,0,0] for _ in range(n)]  # f[i][0/1/2]代表:i向下走最大路径和,向下走次大路径和,向上走最大路径和;答案一定在向下或向上走的路径中
        def dfs1(u,fa):  # 更新向下走的最大/次大路径和
            f[u][0] = p = price[u]
            for v in g[u]:
                if v != fa:
                    dfs1(v,u)
                    x = f[v][0]+p
                    if f[u][0]<x:
                        f[u][1] = f[u][0]
                        f[u][0] = x
                    elif f[u][1] < x:
                        f[u][1] = x 
        
        def dfs2(u,fa):
            for v in g[u]:
                if v != fa:
                    p = price[v]
                    if f[u][0] == f[v][0] + price[u]:
                        f[v][2] = max(f[u][2],f[u][1]) + p
                    else:
                        f[v][2] = max(f[u][2],f[u][0]) + p 
                    dfs2(v,u)
        dfs1(0,-1)
        dfs2(0,-1)
                   
        return max(max(a-price[i],c-price[i]) for i,(a,_,c) in enumerate(f))       

树形DP

class Solution:
    def maxOutput(self, n: int, edges: List[List[int]], price: List[int]) -> int:
        g = [[] for _ in range(n)]
        for u,v in edges:
            g[u].append(v)
            g[v].append(u)
            # print(u,v)
        ans = 0

        def dfs(u,fa):
            nonlocal ans
            ms1 = p = price[u]  # 带叶子的最大路径和
            ms2 = 0  # 不带叶子的最大路径和
            for v in g[u]:
                if v != fa:
                    s1,s2 = dfs(v,u)  # 带叶子,不带叶子
                    ans = max(ans,s1+ms2,s2+ms1)  # 当前带叶子的路径和+之前不带叶子的路径和,当前不带叶子+之前带叶子
                    ms1 = max(ms1,s1+p)
                    ms2 = max(ms2,s2+p)
            return ms1,ms2
        dfs(0,-1)
        return ans

六、参考链接

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

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

相关文章

文献阅读总结--合成生物学工程促进大肠杆菌中莽草酸的高水平积累

题目&#xff1a;Systems engineering of Escherichia coli for high-level shikimate production (ME 2022) 0 前言 本版块内容为记录阅读的文献内容总结经典方法手段。本文内容来自相关文献&#xff0c;在文末做来源进行详细说明对文献中内容不做真实性评价。 1 具体内容 …

标准化和归一化概念澄清与梳理

标准化和归一化是特征缩放(feature scalingscaling)的主要手段&#xff0c;其核心原理可以简单地理解为&#xff1a;让所有元素先减去同一个数&#xff0c;然后再除以另一个数&#xff0c;在数轴上的效果就是&#xff1a;先将数据集整体平移到有某个位置&#xff0c;然后按比例…

【C进阶】动态内存管理

家人们欢迎来到小姜的世界&#xff0c;<<点此>>传送门 这里有详细的关于C/C/Linux等的解析课程&#xff0c;家人们赶紧冲鸭&#xff01;&#xff01;&#xff01; 客官&#xff0c;码字不易&#xff0c;来个三连支持一下吧&#xff01;&#xff01;&#xff01;关注…

Spring 中最常用的 11 个扩展点

目录 1.自定义拦截器 2.获取Spring容器对象 2.1 BeanFactoryAware接口 2.2 ApplicationContextAware接口 3.全局异常处理 4.类型转换器 5.导入配置 5.1 普通类 5.2 配置类 5.3 ImportSelector 5.4 ImportBeanDefinitionRegistrar 6.项目启动时 7.修改BeanDefiniti…

MySQL高级【MVCC原理分析】

1&#xff1a;MVCC1.1&#xff1a;基本概念1). 当前读 读取的是记录的最新版本&#xff0c;读取时还要保证其他并发事务不能修改当前记录&#xff0c;会对读取的记录进行加 锁。对于我们日常的操作&#xff0c;如&#xff1a;select ... lock in share mode(共享锁)&#xff0c…

技术人员和非技术人员如何写出优质博客?-涵子的个人想法

大家好&#xff0c;我是涵子。今天&#xff0c;我们来沉重的聊聊一个大家都很关心的一个问题&#xff1a;技术人员和非技术人员如何写出优质博客&#xff1f; 目录 前言 初写博客&#xff0c;仰望大师 中段时期&#xff0c;无粉无赞 优质博客&#xff0c;涨粉涨赞 优质内容…

前端编写邮件html各邮箱兼容及注意事项

近期由于项目需要&#xff0c;第一次编写邮件html模板&#xff0c;发现各种邮箱兼容问题&#xff0c;尤其是windows自带的邮箱outlook兼容性极差&#xff0c;在此简单做下记录。 注意事项&#xff08;全局样式规则&#xff09; 使用越垃圾的样式越好&#xff0c;绝大部分css3…

Spring面试题

Spring概述&#xff08;10&#xff09; https://blog.csdn.net/zhang150114/article/details/90478753 什么是spring? Spring是一个轻量级JavaEE开发框架&#xff0c;最早有Rod Johnson创建&#xff0c;目的是为了解决企业级应用开发的**业务逻辑层和其他各层的耦合问题。*…

Eclipse 连接 SQL Server 数据库教程

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

JUC面试(一)——JUCJMMvolatile 1.0

JUC&JMM JMM JUC&#xff08;java.util.concurrent&#xff09; 进程和线程 进程&#xff1a;后台运行的程序&#xff08;我们打开的一个软件&#xff0c;就是进程&#xff09;&#xff0c;资源分配单位线程&#xff1a;轻量级的进程&#xff0c;并且一个进程包含多个线程…

Docker部署Nexus通过Maven推送及拉取代码

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; Docker部署Nexus通过Maven推送及拉取代码⏱️ 创作时间&#xff1a; 2023…

如何利用ChatGPT帮你写代码?

最近爆火的ChatGpt相信大家都不陌生&#xff0c;听说它还能写代码&#xff0c;而且能力不凡。作为合格的嵌入式软件工程师&#xff0c;必须得充分利用起来&#xff01; 获取系统IP地址 先写一个脚本&#xff0c;获取系统IP地址吧&#xff0c;没想到还有详细的注释&#xff01…

华亚转债上市价格预测

华亚转债基本信息转债名称&#xff1a;华亚转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;3.4亿元。正股名称&#xff1a;华亚智能&#xff0c;今日收盘价&#xff1a;62.84&#xff0c;转股价格&#xff1a;69.39。当前转股价值 转债面值 / 转股价格 * …

juc系列(1)---进程,线程,并行,并发

目录概述进程线程关系并发并行&#xff1a;同步异步&#xff1a;对比概述 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU,数据加载至内 存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载…

Databend 内幕大揭秘第一弹 - minibend 简介

minibend &#xff0c;一个从零开始、使用 Rust 构建的查询引擎。这里是 minibend 系列技术主题分享的第一期&#xff0c;来自 PsiACE 。 前排指路视频和 PPT 地址 视频&#xff08;哔哩哔哩&#xff09;&#xff1a;https://www.bilibili.com/video/BV1Ne4y1x7Cn PPT&#x…

Unity 之 Addressable可寻址系统 -- 资源加载和释放

可寻址系统资源 -- 加载和资源释放 -- 进阶&#xff08;二&#xff09;一&#xff0c;资源加载1.1 同步异步对比1.2 三种加载模式二&#xff0c;释放资源2.1 基础概念2.2 实例演示2.2.1 示例演示一2.2.2 示例演示二2.3 注意事项概述&#xff1a;本篇文章从资源加载的方式和具体…

Spring官方提供【CSRF攻击】解决方案

步入正文 Cookie cookie是我们常见用来保存用户态信息&#xff0c;cookie跟随我们的请求自动携带。在同一域名下的请求&#xff0c;cookie总是自动携带。 用户态: 当前登入者的用户信息 以上的特性会导致一个潜在漏洞-CSRF CSRF CSRF一般指跨站请求伪造。 跨站请求伪造&…

长安链合约标准协议启动建设,邀请社区用户评审

智能合约是区块链摆脱第三方&#xff0c;实现验证、执行业务逻辑的“看不见的手”。随着联盟链产业落地进入快车道&#xff0c;需要面对的应用场景更加多样&#xff0c;智能合约标准协议作为推动联盟链应用生态繁荣的重要一环也需要加速推进发展。 区块链技术正在发展中规范。…

PHP 连接 MySQL

PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved)PDO (PHP Data Objects) 在 PHP 早期版本中我们使用 MySQL 扩展。但该扩展在 2012 年开始不建议使用。 我是该用 MySQLi &#xff0c;还是 PDO? 如果你需要一个简短的回答&…

C语言 栈的应用 计算简单的中缀表达式

代码简介&#xff1a;下面的代码实现了计算简单的中缀表达式&#xff1a;只可以处理一位正整数的四则运算及括号。是栈的简单应用&#xff0c;要实现中缀表达式运算需要用两个栈&#xff0c;一个存储数字的栈和一个存储运算符的栈&#xff0c;因为懒得写两遍不同的栈上的操作&a…