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;}
};

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

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

相关文章

SpringCloudAlibaba——Sentinel

Sentinel也就是我们之前的Hystrix&#xff0c;而且比Hystrix功能更加的强大。Sentinel是分布式系统的流量防卫兵&#xff0c;以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级等多个维度保护服务的稳定性。 Sentinel采用的是懒加载&#xff0c;这个接口被访问一次&a…

react 实现chatGPT的打印机效果 兼容富文本,附git地址

1、方式一 &#xff1a;使用插件 typed.js typed.js 网站地址&#xff0c;点我打开 1.1、核心代码如下&#xff1a; //TypeWriteEffect/index.tsx 组件 import React, { useEffect, useRef } from react; import Typed from typed.js; import { PropsType } from ./index.d;…

算法进阶指南图论 道路与航线

其实再次看这题的时候。想法就是和强连通分量有关&#xff0c;我们很容易发现&#xff0c;题目中所说的双向边&#xff0c;就构成了一个强连通分量&#xff0c;而所谓的单向边&#xff0c;则相当于把强连通分量进行缩点&#xff0c;然后整个图成为了一个DAG&#xff0c;众所周知…

MongoDB副本集特点验证

MongoDB副本集特点验证 mogodb副本集概述副本集搭建副本集结构验证结果源码地址 mogodb副本集概述 MongoDB副本集是将数据同步在多个服务器的过程。 复制提供了数据的冗余备份&#xff0c;并在多个服务器上存储数据副本&#xff0c;提高了数据的可用性&#xff0c; 并可以保证…

2022ICPC济南站

K Stack Sort 题意&#xff1a;给你一个长度为n的排列&#xff0c;设有m个栈&#xff0c;你需要将这n个数按出现顺序入栈&#xff0c;每次入栈操作从m个栈中选择一个栈从栈顶入栈。当所有元素入栈完成后&#xff0c;需要不断选择栈&#xff0c;将栈中元素弹空。需满足出栈顺序…

【不正经操作】百度深度学习框架paddlepaddle本地运行-Python环境配置笔记

百度深度学习框架PaddlePaddle 百度深度学习框架PaddlePaddle是一个支持深度学习和机器学习的开源框架。它由百度公司于2016年开发并发布&#xff0c;现在已经成为中国最受欢迎的深度学习框架之一&#xff0c;并且在国际上也获得了不少关注。 特点与功能 易于使用 PaddlePa…

ARMday01(计算机理论、ARM理论)

计算机理论 计算机组成 输入设备、输出设备、运算器、控制器、存储器 1.输入设备&#xff1a;将编写好的软件代码以及相关的数据输送到计算机中&#xff0c;转换成计算机能够识别、处理和存储的数据形式 键盘、鼠标、手柄、扫描仪、 2.输出设备&#xff1a;将计算机处理好的数…

解决 github.com 或者 raw.githubusercontent.com 打开慢、打不开问题

系列文章目录 文章目录 系列文章目录前言一、Windows 系统1.1 以管理员身份运行记事本1.2 打开 hosts 文件1.3 写入 IP 地址 二、Linux2.1 hosts 文件位置 三、Android 系统总结 前言 连接手机热点&#xff0c;将流量关闭马上打开&#xff0c;进入的成功率更高 一、Windows 系…

Netty入门指南之NIO 粘包与半包

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言问题产…

深度学习读取txt训练数据绘制参数曲线图的方法

有一些深度学习模型是并不像yolo系列那样最终输出相应的参数图&#xff0c;有很多训练形成了一个训练log文件&#xff0c;于是需要读取log文件中的内容并绘制成曲线图。 如下实例&#xff0c;有一个log文件的部分截图&#xff0c;需要将其读取出来并绘制曲线图 废话不多说&…

前端之Bootstrap框架

目录 【一】Bootstrap介绍 【二】Bootstrap引入 【1】CDN加速链接 【2】注意 【三】布局容器 【四】栅格系统 【五】栅格参数 【六】列偏移 【七】排版 标题 内联文本元素 对齐 改变大小写 引用 列表 【八】表格 基本实例 条纹状表格 带边框的表格 鼠标悬停…

汽车工业生产线数字孪生可视化管理平台,赋予工厂车间数字化智慧化管理

在工业4.0 的时代背景下&#xff0c;随着企业数字化进程的推进&#xff0c;数字孪生可视化技术逐渐在汽车行业得到广泛应用&#xff0c;数字孪生智慧工厂的建设也成为了汽车行业数字化转型的趋势之一。汽车制造业属于典型的离散制造行业&#xff0c;汽车生产包含冲压、焊接、涂…

19.13 Boost Asio 发送TCP流数据

Boost框架中默认就提供了针对TCP流传输的支持&#xff0c;该功能可以用来进行基于文本协议的通信&#xff0c;也可以用来实现自定义的协议。一般tcp::iostream会阻塞当前线程&#xff0c;直到IO操作完成。 首先来看服务端代码&#xff0c;如下所示在代码中首先通过GetFileSize…

C++的Odyssey之旅——STL

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a;我们已经将基本语法了解的差不多了&#xff0c;现在我们就该进入C中最重要也是最富有特点的一部分——STL。在学习C语言中我们想要使用顺序表、链表等一些数据结构进行做题时都需要进行这…

Go invalid memory address or nil pointer dereference错误 空指针问题

Go 指针声明后赋值&#xff0c;出现 panic: runtime error: invalid memory address or nil pointer dereference&#xff0c;这种是内存地址错误。 首先我们要了解指针&#xff0c;指针地址在 Go 中 * 代表取指针地址中存的值&#xff0c;& 代表取一个值的地址对于指针&am…

WordPress主题 JustNews主题6.0.1(亲测首页不空白)

介绍 资源入口 需要用WordPress5.X版本 JustNews介绍&#xff1a;一款专为博客、自媒体、资讯类的网站设计开发的WordPress主题&#xff0c;自v3.0版开始支持自主研发的前端用户中心&#xff0c;不仅支持注册、登录、账户设置、个人中心等常用页面的添加&#xff0c;还可以上传…

【原创】java+jsp+servlet简单图书管理系统设计与实现

摘要&#xff1a; 图书管理系统是一个专门针对图书馆管理而设计的系统&#xff0c;它可以帮助图书管理员有效的对图书进行管理&#xff0c;在图书管理系统的设计中&#xff0c;首先要考虑的是系统的需求分析&#xff0c;该系统的设计与实现涉及多个方面&#xff0c;包括数据库…

【赠书第2期】嵌入式虚拟化技术与应用

文章目录 前言 1 背景概述 2 专家推荐 3 本书适合谁&#xff1f; 4 内容简介 5 书籍目录 6 权威作者团队 7 粉丝福利 前言 随着物联网设备的爆炸式增长和万物互联应用的快速发展&#xff0c;虚拟化技术在嵌入式系统上受到了业界越来越多的关注、重视和实际应用。嵌入式…

Linux 入门

Linux 入门 1&#xff1a;linux 用户 root 用户 &#xff1a;也叫超级用户&#xff0c;UID0&#xff0c;其权限最高。系统用户&#xff1a;也叫虚拟用户&#xff0c;UID 1-999普通用户: UID1000-60000, 可以登录系统,操作自己目录下的文件. 1.1:用户操作命令 切换用户: su …

ts面试题总结

文章目录 前言ts和js的区别&#xff1f;什么是Typescript的方法重载&#xff1f;Typescript中never 和 void 的区别&#xff1f;typescript 中的 is 关键字有什么用&#xff1f;TypeScript支持的访问修饰符有哪些&#xff1f;如何定义一个数组&#xff0c;它的元素可能是字符串…