Leetcode 第 404 场周赛题解

题解/算法 {3177. 求出最长好子序列 II} 1 阅读详情

Leetcode 第 404 场周赛题解

题目1:3200. 三角形的最大高度

思路

枚举第一行是红色还是蓝色,再按题意模拟即可。

代码

/*
 * @lc app=leetcode.cn id=3200 lang=cpp
 *
 * [3200] 三角形的最大高度
 */

// @lc code=start
class Solution
{
public:
    int maxHeightOfTriangle(int red, int blue)
    {
        if (red <= 0 || blue <= 0)
            return 0;

        return max(helper(red, blue), helper(blue, red));
    }
    // 辅助函数
    int helper(int x, int y)
    {
        int level = 0;
        while (x >= 0 && y >= 0)
        {
            if (level % 2 == 0)
            {
                x -= (level + 1);
                if (x < 0)
                    break;
            }
            else
            {
                y -= (level + 1);
                if (y < 0)
                    break;
            }
            level++;
        }
        return level;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(min(sqrt(red), sqrt(blue)))。

空间复杂度:O(1)。

题目2:3201. 找出有效子序列的最大长度 I

思路

全奇数、全偶数、奇偶交替三种情况的最大值即为所求。

代码

/*
 * @lc app=leetcode.cn id=3201 lang=cpp
 *
 * [3201] 找出有效子序列的最大长度 I
 */

// @lc code=start
class Solution
{
public:
    int maximumLength(vector<int> &nums)
    {
        // 分三种情况:全奇、全偶、奇偶交替
        int odd = 0, even = 0;
        for (int &num : nums)
        {
            if (num % 2)
                odd++;
            else
                even++;
        }
        int interlaced = 1, tag = nums[0];
        for (int i = 1; i < nums.size(); i++)
            if ((nums[i] & 1) ^ (tag & 1))
            {
                interlaced++;
                tag = nums[i];
            }
        return max(interlaced, max(odd, even));
    }
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目3:3202. 找出有效子序列的最大长度 II

思路

本题是选与不选的子序列问题,可以尝试给出这样的状态定义:

dp[i][j]:以 nums[i] 结尾模 k 后值为 j 的最长子序列的长度。

那么状态转移方程是怎样的呢?对于每一个 i,遍历 j(0<=j<i),dp[i][(nums[i] + nums[j]) % k] = dp[j][(nums[i] + nums[j]) % k] + 1,保证模 k 后的值相同。

代码

/*
 * @lc app=leetcode.cn id=3202 lang=cpp
 *
 * [3202] 找出有效子序列的最大长度 II
 */

// @lc code=start
class Solution
{
public:
    int maximumLength(vector<int> &nums, int k)
    {
        int n = nums.size();
        // dp[i][j]: 以 nums[i] 结尾模 k 后值为 j 的最长子序列的长度
        vector<vector<int>> dp(n, vector<int>(k, 0));
        // 初始化
        for (int i = 0; i < n; i++)
            dp[i][0] = 1;
        int ans = 1;
        // 状态转移
        for (int i = 1; i < n; i++)
            for (int j = 0; j < i; j++)
            {
                dp[i][(nums[i] + nums[j]) % k] = dp[j][(nums[i] + nums[j]) % k] + 1;
                ans = max(ans, dp[i][(nums[i] + nums[j]) % k]);
            }
        return ans;
    }
};
// @lc code=end

复杂度分析

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

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

题目4:3203. 合并两棵树后的最小直径

思路

题解:连接直径中点(Python/Java/C++/Go)

代码

/*
 * @lc app=leetcode.cn id=3203 lang=cpp
 *
 * [3203] 合并两棵树后的最小直径
 */

// @lc code=start
class Solution
{
private:
    // 求树的直径
    int diameter(vector<vector<int>> &edges)
    {
        vector<vector<int>> g(edges.size() + 1);
        for (auto &e : edges)
        {
            int x = e[0], y = e[1];
            g[x].push_back(y);
            g[y].push_back(x);
        }

        int res = 0;
        auto dfs = [&](auto &&dfs, int x, int fa) -> int
        {
            int max_len = 0;
            for (auto y : g[x])
            {
                if (y != fa)
                {
                    int sub_len = dfs(dfs, y, x) + 1;
                    res = max(res, max_len + sub_len);
                    max_len = max(max_len, sub_len);
                }
            }
            return max_len;
        };
        dfs(dfs, 0, -1);
        return res;
    }

public:
    int minimumDiameterAfterMerge(vector<vector<int>> &edges1, vector<vector<int>> &edges2)
    {
        // 设树 1 的长度为 d1
        int d1 = diameter(edges1);
        // 设树 2 的长度为 d2
        int d2 = diameter(edges2);
        // 答案为三种情况的最大值:
        // 1. d1
        // 2. d2
        // 3. 连接两棵树的直径中点,(d1 + 1) / 2 + (d2 + 1) / 2 + 1
        return max(max(d1, d2), (d1 + 1) / 2 + (d2 + 1) / 2 + 1);
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n+m),其中 n 是数组 edges1 的长度,m 是数组 edges2 的长度。

空间复杂度:O(n+m),其中 n 是数组 edges1 的长度,m 是数组 edges2 的长度。

Yocto下载加速秘籍:用清华镜像+PREMIRRORS配置让构建速度翻倍 本文详细解析了如何通过配置Yocto的PREMIRRORS优先级策略,并利用清华大学等国内镜像源,显著加速构建过程中的源码下载。文章提供了具体的配置示例和验证方法,帮助开发者解决网络瓶颈,实现构建速度翻倍,提升开发效率。 阅读详情

相关推荐

模块学习(一)——编码电机

编码电机测速

qq_51406846的博客 7911

Leetcode3202. 找出有效子序列的最大长度 II

Leetcode3202. 找出有效子序列的最大长度 II

ProgramNovice的博客 728

探针卡技术演进:从金线微针到MEMS探针的Wafer Sort革命

本文探讨了探针卡技术从传统金线微针到MEMS探针的演进,及其对晶圆测试(Wafer Sort)的革命性影响。随着芯片焊垫间距进入45微米以下,MEMS技术凭借其超高精度、超长寿命和卓越的信号完整性,成为应对高密度、高速及3D IC测试挑战的关键,显著提升了测试效率与稳定性。

lstm7chronicler的博客 365

【从零开始的LeetCode-算法】3202. 找出有效子序列的最大长度 II

如果其满足以下条件,则称其为。

九圣残炎的编程博客 394

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 710

从外包到转正:一个华为OD亲历者的真实工作体验与避坑指南

本文分享了一位华为OD员工从外包到转正的真实经历与实用建议。通过详细解析华为OD的日常工作、转正核心指标、机试备考技巧及职场突围策略,为读者提供了一份全面的避坑指南。特别针对机试E卷的高频考点和刷题方法,给出了具体的数据分析和实战经验。

weixin_33686714的博客 705

leetcode 404 周赛 找出有效子序列的最大长度 II「暴力」「动态规划」

leetcode 404 周赛 找出有效子序列的最大长度 II「暴力」「动态规划」

Suryxin's blogs 1249

Epicor ERP 界面新增客制化字段操作方法

我发现国内对于epicor这个erp软件的教程非常少,所以录制一些我实际遇到的需求,整理了实现过程,提供给大家参考。

cqxianggang的专栏 413

leetcode:522. 最长特殊序列 II【判断子序列 + 排序 + 一点小技巧】

分析 首先只需要考虑字符串本身,如果有一个最长的(唯一的)那它肯定是独有的 因此我们两重循环(从最长str的判断) 判断这个str是否是其他的子序列即可 若不是 则返回这个的长度 若是 考察下一组 若都无 则返回-1 这里子序列的判断算法采用了index的贪心 每次记录s在t的index 然后用find(t, index)对index进行更新 保持相对顺序即可 ac code class Solution: def findLUSlength(self, strs: List[str]) -&gt.

小楼一夜听春雨 587

如何使用CPU-Z获取内存条频率信息(编程)

当我们需要获取计算机内存条的频率信息时,可以利用CPU-Z这个工具来实现。CPU-Z是一款专门用于获取计算机硬件信息的工具,它提供了API接口,我们可以通过编程的方式来获取内存条频率信息。你可以从CPU-Z官方网站下载适用于你的操作系统的CPU-Z程序,并从安装目录中找到。函数,我们可以初始化CPU-Z,如果返回值不为0,则表示初始化失败。函数来获取内存条频率信息,如果返回值小于等于0,则表示获取失败。函数来初始化CPU-Z并获取内存条频率信息。最后,我们将获取到的内存条频率信息打印输出,并使用。

ByteProwl的博客 460

【3D Slicer】的小白入门使用指南一

3D Slicer 是一个免费的开源软件平台,用于医学、生物医学和其他 3D 图像的可视化、处理、分割、配准和分析。Slicer 的功能包括:读/写。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 5556

LeetCode——第 404 场周赛

LeetCode周赛

庄的博客 1113

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

leetcode第 404 场周赛

不知道最多有多少层,所以,不如直接递推来完成。

Water_Sunzhipeng的博客 317

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

历次周赛、专场竞赛、春秋赛题目场次及对应具体题目题号+链接汇总

Warm Up Contest: 386.字典序排数 387.字符串中的第一个唯一字符 388.文件的最长绝对路径 Weekly Contest 2: 389. 找不同 390. 消除游戏 391. 完美矩形 Weekly Contest 3: 392. 判断子序列 393. UTF-8 编码验证 394. 字符串解码 395. 至少有 K 个重复字符的最长子串 Weekly Contest 4: 396. 旋转函数 397. 整数替换 398. 随机数索引 399. 除法求值 Weekly Contest

zhuruihe2014的博客 5314

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

牛客网力扣怎么选?TaoToken 这样配 Codex 出选型报告

牛客网和力扣怎么选?与其手动来回切换两套题库,不如用 Codex 按题库结构、免费可用度、真题覆盖三个维度直接生成选型报告。本文从拿 TaoToken API Key 开始,修改 ~/.codex/config.toml 将 base_url 填为接口地址,配置模型 ID 后即可让 Codex 输出力扣 + 牛客组合刷题方案,并排查 401 和模型不存在的常见报错。完整配置入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end

weixin_42604188的博客 14

LeetCode刷题记录

每天进步一点点! LeetCode刷题记录目录1.日常刷题2.每日一题3.周赛 1.日常刷题 题目 难度 NO.1 二维数组中的查找(数组、二分法) ⭐⭐ 2.每日一题 题目 难度 46&47_全排列I&II ⭐⭐ 3.周赛 题目 难度 周赛 20201004 ⭐⭐⭐⭐ 周赛 20201213 ⭐⭐⭐ ...

qq_39618369的博客 479

记录自己的比赛

中国时间:2024-07-06 22:30。

ansizy的博客 305

构建高效本地LeetCode刷题环境:从VSCode配置到自动化脚本实践

算法练习是程序员提升编码能力的核心路径,其关键在于构建一个高效、专注且可管理的学习环境。本地化刷题工具通过集成代码编写、运行测试和笔记管理,解决了在线平台的网络依赖与数据分散问题。从技术原理上看,这类工具通常基于脚本语言(如Python)实现自动化,结合本地数据库进行题目管理,并利用成熟的IDE(如VSCode)插件生态提供代码高亮与即时运行能力。其技术价值在于将学习过程工程化,形成可追溯、可复用的个人知识体系,尤其适合面试冲刺与系统性复习。应用场景广泛覆盖算法学习者、求职者及工具整合爱好者。本文以“刷Le

aodiyi6351的博客 560

leetcode3202. 找出有效子序列的最大长度 II

leetcode3202. 找出有效子序列的最大长度 II--kotlin版。这道题为404场周赛第三题,比赛的时候用的枚举记忆,C++写的,不出意外的超时了,也在这里列出了给大家瞧瞧吧。###主要为了学习kotlin,顺便做做题,记录一下###。

qq_44407144的博客 459

leetcode周赛272场

每日一场leetcode周赛,不定期更新

公仔面 806

【LeetCode周赛】第366场周赛

LeetCode第366场周赛

lunaol的博客 189

Leetcode - 周赛418

leetcode - 周赛418,主要知识点:递归,构造,枚举+容斥+二分前缀和

m0_74859835的博客 928

前端工程师的 LeetCode 之旅 -- 180周赛

01 矩阵中的幸运数字题目描述【Easy】给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。幸运数是指矩阵中满足...

descire 365

leetcode竞赛:307场周赛

就不贴链接了,leetcode直接搜题目就行。

weixin_43233774的博客 425

LeetCode---380周赛

LeetCode---380周赛---数位dp/找规律+KMP

V_zjs的博客 1239

LeetCode 第422场周赛个人题解

Q2. 到达最后一个房间的最少时间 IQ3. 到达最后一个房间的最少时间 II。

EQUINOX1的博客 826
上一篇: Leetcode3202. 找出有效子序列的最大长度 II
下一篇: Visual Studio 2022 + Qt 编写 VTK 程序
UestcXiye
博客等级 码龄8年 9030粉丝 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、付费专栏及课程。

余额充值