Leetcode---370周赛

题目列表

2923. 找到冠军 I

2924. 找到冠军 II 

2925. 在树上执行操作以后得到的最大分数 

2926. 平衡子序列的最大和

一、找到冠军I 

 

第一题模拟题,简单来说是看每一行(列)是否全是1,当然不包括自己比自己强的情况,需要特判

代码如下

class Solution {
public:
    int findChampion(vector<vector<int>>& grid) {
        int n=grid.size();
        for(int i=0;i<n;i++){
            int j;
            for(j=0;j<n;j++){
                if(i!=j&&grid[i][j]==0){
                    break;
                }
            }
            if(j==n)
                return i;
        }
        return -1;
    }
};

二、找到冠军II

这题和上题相似,但是所给的数据内容不同。只要看图中是否只有一个结点的入度为0就行

代码如下

class Solution {
public:
    int findChampion(int n, vector<vector<int>>& edges) {
        vector<int>deg(n);
        for(auto&e:edges){
            int y=e[1];
            deg[y]++;
        }
        int ans=-1;
        for(int i=0;i<n;i++){
            if(!deg[i]){
                if(ans!=-1)
                    return -1;
                ans=i;
            }
        }
        return ans;
    }
};

三、在树上执行操作以后得到的最大分数

 

这题的题目意思是让这棵树的每条路径和都>0,同时让自己获得的分数最大

如果正着思考,我们就要考虑选哪些点,使得我们获得的分数最大,同时保持树的健康,这样思考无论是从上往下走,还是从上往下走,我们都要去考虑遍历到的结点的上下两边的情况,比较麻烦

那么正难则反,如果我们逆着思考,即考虑选哪些结点留在树上,那么我们就可以边遍历,边找最小值,然后用 总价值 减去 留在书上的最小值 得到答案

代码如下

class Solution {
    typedef long long LL;
public:
    long long maximumScoreAfterOperations(vector<vector<int>>& edges, vector<int>& values) {
        int n=values.size();
        vector<vector<int>>g(n);
        for(auto&e:edges){
            int x=e[0],y=e[1];
            g[x].push_back(y);
            g[y].push_back(x);
        }
        
        //该dfs函数用来计算一棵树的每条路径上的最小值之和
        function<LL(int,int)>dfs=[&](int x,int fa)->LL{
            LL res=0;
            for(int y:g[x]){
                if(y!=fa){
                    res+=dfs(y,x);
                }
            }
            return res==0?values[x]:min((LL)values[x],res);//如果res=0说明是叶子节点,直接返回结点值
        };
        LL s=accumulate(values.begin(),values.end(),0LL);
        return s-dfs(0,-1);
    }
};

四、平衡子序列的最大和

正常来说,求子序列的最大元素和,用动态规划就行,这题有点特殊,需要优化时间复杂度,我们先来看看正常的动规的写法

思路:将题目给的不等式移项,得到num[ i ] - i >= nums[ j ] - j,这样我们就将两个相互影响的值,变成了只和自己有关的nums[i]-i,我们用数组b存放nums[i] - i

动规:

dp数组含义:dp[i]表示以i为结尾的最大元素和

递推公式:dp[i]=max(dp[j],0)+nums[i]        条件  j<i && b[j]<=b[i]

初始化具体在代码,答案为max(dp[i])

class Solution {
public:
    typedef long long LL;
    long long maxBalancedSubsequenceSum(vector<int>& nums) {
        int n=nums.size();
        LL ans=INT_MIN;
        vector<LL>dp(nums.begin(),nums.end());
        for(int i=0;i<n;i++){
            for(int j=i-1;j>=0;j--){
                if(nums[i]-i>=nums[j]-j)
                    dp[i]=max(dp[j]+nums[i],dp[i]);
            }
            ans=max(dp[i],ans);
        }
        return ans;
    }
};

上面代码的时间复杂度是O(n^2),数据范围太大,过不了,那么如何优化时间复杂度?

上面代码最浪费时间的是 dp[i]=max(dp[j])+nums[i] 这行代码,即查找最大值速度慢了,那么我们怎么才能提高查找的速度?这里就要引入一个数据结构---树状数组,它其实和线段树相似,是线段树的"子集"。

如果没听过的,可以去了解一下,这里不具体讲它的原理

(这里推荐一个视频,讲得很简洁明了:五分钟丝滑动画讲解 | 树状数组_哔哩哔哩_bilibili )

树状数组适合维护前缀和/前缀最大值+单点更新这类题目,更新和查询的时间复杂度均为O(logn)

而求 max(dp[j]) 不就是维护前缀最大值吗?每当计算出一个dp[i],就去更新树状数组,简直完美

现在还有一点需要注意:我们怎么样去将b[i]和树状数组的下标映射起来,这里又有一个知识点:离散化【复制+排序+去重】具体看代码(这个就是几行代码的事,很简单的)

(这里有人可能会对将b[i]和树状数组的下标映射这点感到疑惑,因为我们上面分析的是对dp数组的前缀最大值进行维护才对,解释一下:我们的递推公式有两个条件,j<i && b[j]<=b[i],我们是从左往右遍历的,所以更新到树状数组中的值全部满足j<i的情况,即我们只要考虑b[j]<=b[i]这个条件就行,那么我们对b数组排序之后,映射到树状数组的下标后,自然就满足这个条件了,我们只要在比b[i]小的b[j]元素对应的dp[i]中求最大值就行,即求前缀最大值)

代码如下

typedef long long LL;
class BIT{    
    vector<LL>bit;
public:
    BIT(int n):bit(n,LLONG_MIN){}
    void updata(int i,LL data){
        while(i<bit.size()){
            bit[i]=max(bit[i],data);
            i+=(i&-i);
        }
    }

    LL pre_max(int i){
        LL res=LLONG_MIN;
        while(i>0){
            res=max(res,bit[i]);
            i&=(i-1);
        }
        return res;
    }
};
class Solution {
public:
    long long maxBalancedSubsequenceSum(vector<int>& nums) {
        int n=nums.size();
        vector<int>b(n);
        //离散化
        //1.复制
        for(int i=0;i<n;i++)
            b[i]=nums[i]-i;
        //2.排序
        sort(b.begin(),b.end());
        //3.去重
        b.erase(unique(b.begin(),b.end()),b.end());
        LL ans=LLONG_MIN;
        BIT tree(n+1);
        for(int i=0;i<n;i++){
            int j=lower_bound(b.begin(),b.end(),nums[i]-i)-b.begin()+1;//计算下标
            LL data=max(0LL,tree.pre_max(j))+nums[i];
            tree.updata(j,data);
            ans=max(ans,data);
        }
        return ans;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

支持C#的开源免费、新手友好的数据结构与算法入门教程 - Hello算法

前言 前段时间完成了C#经典十大排序算法&#xff08;完结&#xff09;然后有很多小伙伴问想要系统化的学习数据结构和算法&#xff0c;不知道该怎么入门&#xff0c;有无好的教程推荐的。今天给大家推荐一个支持C#的开源免费、新手友好的数据结构与算法入门教程&#xff1a;He…

STM32Cube +VSCode开发环境搭建

STM32Cube VSCode开发环境搭建 0.前言一、各种方式对比1.STM32CubeMX CLion2.STM32CubeIDE VSCode STM32 VSCode Extension3.VSCode EIDE插件 二、STM32CubeIDE VSCode STM32 VSCode Extension环境搭建1.需要安装的软件2.相关配置3.编译测试 三、总结 0.前言 工欲善其事&…

Qt QtCreator调试Qt源码配置

目录 前言1、编译debug版Qt2、QtCreator配置3、调试测试4、总结 前言 本篇主要介绍了在麒麟V10系统下&#xff0c;如何编译debug版qt&#xff0c;并通过配置QtCreator实现调试Qt源码的目的。通过调试源码&#xff0c;我们可以对Qt框架的运行机制进一步深入了解&#xff0c;同时…

HTML_案例1_注册页面

用纯html页面&#xff0c;不用css画一个注册页面。 最终效果如下&#xff1a; html页面代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head>…

【Git】Git安装入门使用常用命令Gitee远程仓库上传文件与下载

一&#xff0c;Git入门 1.1 Git是什么 Git是一款分布式版本控制系统&#xff0c;被广泛用于软件开发中的源代码管理。它由Linus Torvalds在2005年创造并发布&#xff0c;旨在解决传统版本控制系统&#xff08;如SVN&#xff09;的一些局限性。主要用于敏捷高效地处理任何或小或…

【解决方案】vue 项目 npm run dev 时报错:‘cross-env‘ 不是内部或外部命令,也不是可运行的程序

报错 cross-env 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! estate1.0.0 dev: cross-env webpack-dev-server --inline --progress --config build/webpack.dev.conf.js npm ERR! Exit status 1 np…

Pytorch 里面torch.no_grad 和model.eval(), model.train() 的作用

torch.no_grad: 影响模型的自微分器&#xff0c;使得其停止工作&#xff1b;这样的话&#xff0c;数据计算的数据就会变快&#xff0c;内存占用也会变小&#xff0c;因为没有了反向梯度计算&#xff0c;当然&#xff0c;我哦们也无法做反向传播。 model.eval() 和model.train()…

Dockerfile搭建lnmp

目录 任务需求&#xff1a; 一、准备&#xff1a; 二、部署nginx容器&#xff08;172.18.0.10&#xff09;&#xff1a; 1.编写Dockerfile构建镜像&#xff1a; 2.准备nginx配置文件&#xff1a; 3.构建镜像&#xff0c;启动nginx容器&#xff1a; 三、部署mysql容器&#x…

Flutter学习:使用CustomPaint绘制路径

Flutter学习&#xff1a;认识CustomPaint组件和Paint对象 Flutter学习&#xff1a;使用CustomPaint绘制路径 Flutter学习&#xff1a;使用CustomPaint绘制图形 Flutter学习&#xff1a;使用CustomPaint绘制文字 Flutter学习&#xff1a;使用CustomPaint绘制图片 drawPath 绘制路…

矢量绘图软件Sketch 99 for mac

Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员&#xff0c;帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面&#xff0c;以及丰富的功能集&#xff0c;使得用户可以轻松地创建、编辑和共享精美的…

C++ vector 动态数组的指定元素删除

文本旨在对 C 的容器 vector 进行肤浅的分析。 文章目录 Ⅰ、vector 的指定元素删除代码结果与分析 Ⅱ、vector 在新增元素后再删除指定元素代码结果与分析 Ⅲ、vector 在特定条件下新增元素代码结果与分析 参考文献 Ⅰ、vector 的指定元素删除 代码 #include <iostream&g…

Python语言:经典例题分析讲解

题1&#xff1a; 通过观察我们可以得出以下结论&#xff1a; 代码实现&#xff1a; """ &#xff08;3&#xff09;输入整数n&#xff0c;输出n行的字符图案。如n5时输出以下图案&#xff1a;* *** ***** ******* *********""""" for…

河南开放大学与电大搜题微信公众号:携手共进,助力学习之路

作为河南省内颇具影响力和声誉的高等教育机构之一&#xff0c;河南开放大学一直致力于提供优质的教育资源和灵活的学习方式&#xff0c;以满足广大学习者的需求。而在这个追求知识的时代&#xff0c;学习者们尤其需要一个便捷、高效的工具来辅助学习。电大搜题微信公众号应运而…

python编程复习系列——week2(Input Output (2))

文章目录 一、多行代码语句二、Escape序列三、字符串格式四、数值运算课后作业 一、多行代码语句 &#x1f95e;使用反斜杠\来表示在下一行中继续使用一条语句。 subject_code "CSCI111" subject_mark 80 subject_grade "D" result "Subject re…

软件测试|黑盒测试方法论-判定表

在因果图分析法中最后会得出一个判定表&#xff0c;可以看出因果图和判定表是有联系的&#xff0c;一般需要结合起来使用。 因果图是一种分析工具&#xff0c;通过分析最终得到判定表&#xff0c;再通过判定表编写测试用例。在一定情况下也可以直接书写判定表&#xff0c;省略…

使用eXplorer本地搭建免费在线文件管理器并实现远程登录——“cpolar内网穿透”

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件&#xff0c;是互联网最重要的应用之一&#xff0c;无论是…

Docker 学习路线 13:部署容器

部署容器是使用Docker和容器化管理应用程序更高效、易于扩展和确保跨环境一致性性能的关键步骤。本主题将为您概述如何部署Docker容器以创建和运行应用程序。 概述 Docker容器是轻量级、可移植且自我包含的环境&#xff0c;可以运行应用程序及其依赖项。部署容器涉及启动、管…

设计模式之生产者/消费者模式

文章目录 1. 简介2. 代码实现 1. 简介 生产者消费者模式与保护性暂停模式的GuardObject不同&#xff0c;它不需要产生结果和消费结果的线程一一对应。它使用一个消息队列来平衡生产者和消费者的线程资源。其中生产者仅负责产生结果数据&#xff0c;不关心数据该如何处理&#…

【算法与数据结构】17、LeetCode电话号码的字母组合

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题需要解决的问题有三个&#xff1a; 一、如何实现数字到字母的映射二、如何实现组合问题三、如何解…

基于OpenFOAM求解器二次开发

OpenFOAM&#xff08;Open Field Operation and Manipulation&#xff09;是一个开源的计算流体动力学&#xff08;CFD&#xff09;软件包。它提供了各种模拟和建模工具&#xff0c;用于研究和解决复杂的流体流动问题。 OpenFOAM提供了一个强大的求解器库&#xff0c;可以用于…