Leetcode 第 361 场周赛题解

【深度优先 LCA 】2846. 边权重均等查询|2508 现有一棵由 n 个节点组成的无向树,节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ui, vi, wi] 表示树中存在一条位于节点 ui 和节点 vi 之间、权重为 wi 的边。 另给你一个长度为 m 的二维整数数组 queries ,其中 queries[i] = [ai, bi] 。对于每条查询,请你找出使从 ai 到 bi 路径上每条边的权重相等所需的 最小操作次数 。在一次操作中,你可以选择树上的任意一条 阅读详情

Leetcode 第 361 场周赛题解

题目1:2843. 统计对称整数的数目

思路

枚举。

代码

class Solution
{
public:
    int countSymmetricIntegers(int low, int high)
    {
        int count = 0;
        for (int num = low; num <= high; num++)
            if (check(num))
                count++;
        return count;
    }
    // 辅函数 - 判断 x 是不是一个对称整数
    bool check(int x)
    {
        vector<int> digits;
        while (x)
        {
            digits.push_back(x % 10);
            x /= 10;
        }
        if (digits.size() % 2 == 1)
            return false;
        int sum = 0;
        for (int i = 0; i < digits.size() / 2; i++)
            sum += digits[i];
        for (int i = digits.size() / 2; i < digits.size(); i++)
            sum -= digits[i];
        return sum == 0;
    }
};

取巧做法:将数字转化为字符串。

class Solution
{
public:
    int countSymmetricIntegers(int low, int high)
    {
        int count = 0;
        for (int num = low; num <= high; num++)
        {
            string s = to_string(num);
            if (s.size() % 2 == 0 && accumulate(s.begin(), s.begin() + s.size() / 2, 0) == accumulate(s.begin() + s.size() / 2, s.end(), 0))
                count++;
        }
        return count;
    }
};

复杂度分析

时间复杂度:O((high−low)*log(high))。

空间复杂度:O(log(high))。

题目2:生成特殊数字的最少操作

思路

贪心。

一个数能被 25 整除,有如下五种情况:

  • 这个数是 0。
  • 这个数以 00 结尾。
  • 这个数以 25 结尾。
  • 这个数以 50 结尾。
  • 这个数以 75 结尾。

设字符串的长度为 n。

我们从字符串的末尾往开头遍历,设当前数位为 digit,使用数组 count 记录数位的出现次数。

假设我们遍历到第 i 位,有 digit = num[i] - ‘0’,此时:

  • 当 count[0] = 2 时,不管 digit 是什么,我们都可以构建一个以 00 结尾的数字。第 0 位到第 i 位的数字可以保留,后面两个 0 可以保留,其他位删除,所以一共需要删除 n - (i + 3) 位数字。
  • 当 digit = 2 && count[5] > 0 时,我们都可以构建一个以 25 结尾的数字。第 0 位到第 i 位的数字可以保留,后面的 5 也可以保留,其他位删除,所以一共需要删除 n - (i + 2) 位数字。
  • 同理,当 digit = 5 && count[0] > 0 时,我们都可以构建一个以 50 结尾的数字,一共需要删除 n - (i + 2) 位数字;当 digit = 7 && count[5] > 0 时,我们都可以构建一个以 75 结尾的数字,一共需要删除 n - (i + 2) 位数字。
  • 最后别忘了 count[digit]++。

其他情况,我们都必须将字符串删到只剩 0 为止,删除次数为 n - count[0]。

代码

/*
 * @lc app=leetcode.cn id=2844 lang=cpp
 *
 * [2844] 生成特殊数字的最少操作
 */

// @lc code=start
class Solution
{
public:
    int minimumOperations(string num)
    {
        int n = num.size();
        vector<int> count(10, 0);
        for (int i = n - 1; i >= 0; i--)
        {
            int digit = num[i] - '0';
            // 以00结尾
            if (count[0] == 2)
                return n - i - 3;
            // 以25/50/75结尾
            if ((digit == 2 && count[5]) || (digit == 5 && count[0]) || (digit == 7 && count[5]))
                return n - i - 2;
            count[digit]++;
        }
        // 删到只剩0
        return n - count[0];
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 为字符串 num 的长度。

空间复杂度:O(n),其中 n 为字符串 num 的长度。

题目3:统计趣味子数组的数目

思路

前缀和。

对于本题,由于需要统计 cnt,我们可以把满足 nums[i] % modulo = k 的 nums[i] 视作 1,不满足则视作 0。

用数组 fun 记录上述结果。

如此转换后,算出 fun 的前缀和数组 preSum,那么题目中的 cnt 等价于 preSum[right + 1] - preSum[left]。

枚举 left 和 right,计算趣味子数组的数目,即满足 (preSum[right + 1] - preSum[left]) % modulo = k 的个数。

/*
 * @lc app=leetcode.cn id=2845 lang=cpp
 *
 * [2845] 统计趣味子数组的数目
 */

// @lc code=start
class Solution
{
public:
    long long countInterestingSubarrays(vector<int> &nums, int modulo, int k)
    {
        int n = nums.size();
        vector<int> fun(n, 0);
        for (int i = 0; i < n; i++)
            if (nums[i] % modulo == k)
                fun[i] = 1;
        vector<int> preSum(n + 1, 0);
        for (int i = 1; i <= n; i++)
            preSum[i] = preSum[i - 1] + fun[i - 1];
        long long ans = 0;
        for (int left = 0; left < n; left++)
            for (int right = left; right < n; right++)
            {
                int cnt = preSum[right + 1] - preSum[left];
                if (cnt % modulo == k)
                    ans++;
            }
        return ans;
    }
};
// @lc code=end

结果超时了:

在这里插入图片描述

优化:

(preSum[right + 1] - preSum[left]) % modulo = k 等价于 preSum[left] % modulo = (preSum[right + 1] − k) % modulo。

根据上式,我们可以一边枚举 right,一边用一个哈希表统计有多少个 preSum[right + 1] % modulo,这样可以快速知道有多少个 (preSum[right + 1] − k) % modulo,也就是 preSum[left] % modulo 的个数,把个数加到答案中。

代码

/*
 * @lc app=leetcode.cn id=2845 lang=cpp
 *
 * [2845] 统计趣味子数组的数目
 */

// @lc code=start
class Solution
{
public:
    long long countInterestingSubarrays(vector<int> &nums, int modulo, int k)
    {
        int n = nums.size();
        vector<int> fun(n, 0);
        for (int i = 0; i < n; i++)
            if (nums[i] % modulo == k)
                fun[i] = 1;
        vector<int> preSum(n + 1, 0);
        for (int i = 1; i <= n; i++)
            preSum[i] = preSum[i - 1] + fun[i - 1];
        long long ans = 0;
        unordered_map<int, int> cnt;
        cnt[0] = 1; // 把 preSum[0] = 0 算进去
        for (int right = 0; right < n; right++)
        {
            ans += cnt[(preSum[right + 1] - k + modulo) % modulo];
            cnt[preSum[right + 1] % modulo]++;
        }
        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 nums 的长度。

空间复杂度:O(n),其中 n 是数组 nums 的长度。

题目4:边权重均等查询

超出能力范围。

题解:LCA 模板(Python/Java/C++/Go)

音视频开发—H264相关概念和压缩原理详解(GOP、宏块、帧内压缩、帧间压缩) 本文讲述了H264相关概念和原理——GOP概念,SPS与PPS,帧内压缩原理,帧间压缩原理,解释了什么是运动补偿,什么运动矢量等等概念 阅读详情

相关推荐

SPI模式下的SD卡读写,为什么你的数据总出错?详解时序与状态机避坑指南

本文深入探讨SPI模式下SD卡读写数据出错的根本原因,提供时序优化与状态机设计的实战指南。针对时钟周期计数、状态机跳转和忙检测等核心问题,详解命令时序细节、状态机同步策略及高级避坑技巧,帮助开发者提升SD卡在SPI模式下的稳定性和性能。

weixin_30514745的博客 263

力扣2845(统计趣味子数组的数目)

力扣2845 前缀和+关联哈希+取模

weixin_45842471的博客 359

手把手拆解DGX GB200 NVL72:1个机柜如何塞进72块GPU?详解NVLink Switch铜缆背板设计

本文深度解析英伟达DGX GB200 NVL72系统如何通过NVLink Switch铜缆背板设计,在标准42U机柜中集成72块B200 GPU,实现1800GB/s的超高带宽。文章详细介绍了模块化架构、铜缆互连技术、液冷散热方案和高密度供电系统等核心创新,为AI算力需求提供突破性解决方案。

red88的博客 1594

Leetcode---361周赛

Leetcode---361周赛

V_zjs的博客 513

VizCut 全自动批量视频二次去重处理!支持视频无水印解析下载和批量剪辑,完全免费,使用简单!

可制作和分享剪辑模板,已提供20+种剪辑方案,内置众多扫光蒙版素材。支持二次去重批量处理,完全免费,无广告,且支持视频无水印解析下载,非常强大。如果说我们处理的视频需要进行一样的参数设置的话,就可以把我,1设置的参数设置为模板,后面就可以一键调用。1. 本地CPU处理,可设置线程数,可开启GPU加速,无任何限制,全看机器性能。适用场景:自媒体搬运、短视频二创、批量去重等,完全免费,无广告干扰!3. 20+种参数可调可选,内置很多相关素材。可保存为模板,可复用、可分享、可导入。2. 所有参数的设置,

goodfat的博客 5331

[3D检测系列-PV-RCNN] PV-RCNN实战指南:从论文解析到代码调试全流程

本文提供了PV-RCNN在3D目标检测领域的实战全流程指南。文章深入解析了其Point-Voxel融合的核心思想,并详细演示了从环境搭建、数据准备、代码复现到模型训练与调试的具体步骤,特别针对常见的报错问题给出了解决方案,帮助开发者高效掌握这一经典算法。

weixin_29189381的博客 481

【算法】树上倍增 & LCA

由于不知道 lca 的具体位置,因此从大到小枚举 i,尝试是否可以向上跳,直到 pa[x][i] == pa[y][i],循环结束之后,有 lca = pa[x][0]。当 x 和 y 在同一深度之后,如果 x = y,那么 x 就是 lca,否则 把 x 和 y 一起往上跳。先将 x 和 y 放在同一个深度上,即先让 y 跳 depth[y] - depth[x]。把相关链接放在最前面是因为,周赛遇到了几次,不会做。这才想起来学一下这个算法。两个节点 x 和 y,

小威的博客 645

vivado生成及调用自定义IP的方法

开发环境:vivado 2018.2 1.将整个工程封装为自定义IP 将整个工程封装为自定义IP主要有以下步骤: 步骤1.选中工程中的top模块。点击Tools ------> Create and Package New IP,如图1所示 图1 步骤2.弹出界面后,点击next至图2界面,选择Package your current project,然后继续点击next 图2 步骤3.选择生成的IP路径,如图3所示。这个路径就是后续添加该IP的路径 图3 步骤4.继续点击next,然后选择fi

进击的阿日比 4735

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

幸好上周练习了倍增,否则T4就垮了。T1 数位DP。T2 贪心。T3 同余+前缀和计数。T4 树上前缀和+lca。

liuliangcan的博客 423

未连接互联网的银河麒麟v10安装g++,各种报错,如何处理?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 1805

零基础入门转录组数据可视化——绘制差异小提琴图(常规)

转录组数据可视化之一,先介绍相关基础知识,其次用实际案例为基础,由浅入深介绍差异小提琴图绘制的全过程,包括内容有相关代码和截屏。

呆猪儿的博客 638

leetcode(中等)

【代码】leetcode(中等)

qq_43716830的博客 835

《AgentScope-Java 深入浅出教程》第1章 AgentScope-Java 简介

AgentScope-Java 是一个面向智能体的编程框架,专门用于构建基于大语言模型(LLM)的 AI 应用程序。│ 你的业务应用 ││ AgentScope-Java 框架 ││ │ 智能体 │ │ 工具 │ │ 记忆 │ │ 模型 │ ││ LLM 服务 (DashScope/OpenAI/...) │能力说明类比ReAct 推理让智能体能够"思考"并"行动"就像人类思考后再做事工具调用让智能体能够执行外部操作就像人使用计算器、搜索引擎记忆管理让智能体能够记住对话历史。

步子哥的博客 595

【LeetCode周赛】第 361 场周赛

LeetCode第361场周赛

lunaol的博客 417

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

leetcode 第 361 场周赛

首先写出一串数字 0,25,50,75,100,125...你会发现任意一个数字都只可能出现00,25,50,75四种结尾,然后加上一种全部删除的情况0。求a-b的边数可以转换为r_a-r_lca+r_b-r_lac,所以我们不仅要求每个节点到根节点的距离,还要求出公共节点lca,lca由树上倍增来求的,然后统计a-b的所有边的值分别有多少个,分为两个部分,一个是y往上走的时候统计,一个是同时往上走的时候统计,然后最后是都往上走一步的时候统计,具体细节可以看灵神视频,这里就不再赘述了。

saonantabusao的博客 460

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

leetcode第361场周赛补题

思路:枚举,rfind()思路:转化为字符串后枚举。

qq_62417282的博客 308

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【力扣周赛】第 361 场周赛(⭐前缀和+哈希表 & 树上倍增、LCA⭐)

对于当前的前缀和 sum[r],前面有若干个满足 (sum[r] - sum[x]) % modulo == k 的下标,这些下标的共同特征是:它们的值 sum[x] = (sum[r] - k + modulo) % modulo。求 a 和 b 路径之间的所有边权,都变成相等需要操作几步——实际上是求 a 和 b 之间有几条边,其中出现次数最多的边权出现了几次。在枚举的过程中用哈希表 cnt 记录下满组 sum[i] = y 的 i 的数量,就可以快速找到 r 之前有几个可以和当前下标配对的下标 l。

小威的博客 948

LeetCode第366场周赛学习笔记(学习自灵茶山艾府 AKA 灵神)

本次学习笔记将分析周赛第365场的题目,并提供相关的解题思路和代码实现。这场周赛包括四道题目,分别讨论每道题的解法。

WishLostmymind的博客 520

周赛361(模拟、枚举、记忆化搜索、统计子数组数目(前缀和+哈希)、LCA应用题)

在一次操作中,你可以选择树上的任意一条边,并将其权重更改为任意值。**注意:**子数组是数组中的一个连续非空的元素序列。位数字之和相等,则认为这个数字是一个对称整数。的任意一位数字并将其删除。枚举删除后以 00/25/50/75 结尾。以整数形式表示并返回趣味子数组的数目。个节点组成的无向树,节点按从。对于每条查询,请你找出使从。路径上每条边的权重相等所需的。返回最少需要多少次操作可以使。表示树中存在一条位于节点。在一次操作中,您可以选择。满足下述条件,则称其为。,表示一个非负整数。请你找出并统计数组中。

qq_42958831的博客 868

【OJ比赛日历】快周末了,不来一场比赛吗? #09.02-09.08 #12场

实时聚合多平台的(Kaggle、天池…)和(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注!以下信息仅供参考,以比赛官网为准。

CompHub的博客 305

阿里程序员绩效被判3.25,不及格却被谷歌录取:此生再也不回阿里

前言: 职场就像围城,我们每一个职场人总是以“墙外”的视角羡慕着“墙内”的世界,而也许你的生活也出现在别人的梦中。希望“互联网坊间八卦”能成为一个分享和了解不同生活的平台。 今天,笔者给大家分享一位已离职阿里员工的心声。让我们一起了解一下阿里基层员工最原始的生活状态。希望这些“干货”能让你认识到不一样的阿里。 今天是我人生中最重要的一天,从...

mifffy_java的博客 2万+

统计趣味子数组的数目

给你一个下标从 0 开始的整数数组 nums ,以及整数 modulo 和整数 k。请你找出并统计数组中 趣味子数组 的数目。如果 子数组 nums[l…r] 满足下述条件,则称其为 趣味子数组 :在范围 [l, r] 内,设 cnt 为满足 nums[i] % modulo == k 的索引 i 的数量。并且 cnt % modulo == k。以整数形式表示并返回趣味子数组的数目。注意:子数组是数组中的一个连续非空的元素序列。

tao2386534238的博客 268

leetcode:361.轰炸敌人

题目来源 leetcode 题目描述 题目解析 最好在十字路口,这样可以往四个方向炸 每个炸弹可以往四个方向炸,我们可以先分析一个方向,然后举一反三。 即如果在一个空地放一个炸弹,最多向上能够炸死多少敌人 可以直接枚举,即向上枚举到碰到墙为止。但是时间复杂度太高了 坐标型动态规划 先分析一个方向 (1)确定状态 我们假设有敌人或者有墙的格子也能放炸弹 有敌人的格子:格子里的敌人能够被炸死,并继续向上爆炸 有墙的格子:炸弹不能炸死任何敌人 那么,在(i, j)格放一个炸弹,它向上能

OceanStar的博客 2602

算法每日一题: 边权重均等查询 | 公共子祖先

我们只需要贪心的让两个点之间所有边,变为边权重出现最多的次数的权重,例如寻找a和b两点间修改的最小次数,如果ab两点间所有边中,权重2出现的次数最多,我们就让所有边的值改为2,这样修改的次数就最少了。好,知道这一点,我们的问题就变成了寻找两点间所有权重中,哪个权重出现次数最多。好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!大家好,我是星恒,今天给大家带来的是一道图里面有关公共子祖先的题目,理解起来简单,大家。题目:leetcode 2846。

m0_61780691的博客 1112

[Leetcode] 361. Bomb Enemy 解题报告

题目: Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return the maximum enemies you can kill using one bomb. The bomb kills all the enemies in the

魔豆(Magicbean)的博客 1764

LeetCode-Python-361. 轰炸敌人

给你一个二维的网格图,网格图中的每一个格子里要么是一堵墙'W',要么是一个敌人'E',要么是一个空位'0'(数字 0 ),返回你用一个炸弹最多能杀死敌人的数量。 由于墙体足够坚硬,炸弹的威慑力没有办法穿越墙体,所以炸弹只能把所在位置同一行和同一列所有没被墙挡住的敌人给炸死。 注意:你只能把炸弹放在一个空的格子里 示例: 输入: [["0","E","0","0"],["E",...

Keep Coding 1719
上一篇: Leetcode 第 363 场周赛题解
下一篇: Leetcode 第 360 场周赛题解
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值