Leetcode---364场周赛

题目列表

2864. 最大二进制奇数

2865. 美丽塔 I

2866. 美丽塔 II

2867. 统计树中的合法路径数目

一、最大二进制奇数

这题只要你对二进制有了解(学编程的不会不了解二进制吧),应该问题不大,这题要求最大奇数,1.奇数:只要保证二进制的最低位上是1就行(这里为不了解二进制的同学解释一下,二进制从低位到高位的权重分别是2^0,2^1,2^2...即除了最低位其他位都是偶数,所以最低位必须是1)

2.最大:贪心,我们将除了最低位的1之外的所有1都往高位放,得到的数肯定是最大的

代码如下

class Solution {
public:string maximumOddBinaryNumber(string s) {int cnt1=count(s.begin(),s.end(),'1');return string(cnt1-1,'1')+string(s.size()-cnt1,'0')+'1';}
};

二、美丽塔I

 这题的数据范围比较小,可以直接暴力,将每一个元素都当成山顶算一遍最大高度,然后比较得到最大高度,代码如下

class Solution {
public:long long maximumSumOfHeights(vector<int>& maxHeights) {long long ans=0;int n=maxHeights.size();for(int i=0;i<n;i++){long long res=maxHeights[i];for(int j=i-1,Min=maxHeights[i];j>=0;j--){Min=min(Min,maxHeights[j]);res+=Min;}for(int j=i+1,Min=maxHeights[i];j<n;j++){Min=min(Min,maxHeights[j]);res+=Min;}ans=max(ans,res);}return ans;}
};

三、美丽塔II

这题的题目和上一题一样,只是加大了数据范围,即不能用暴力枚举的方法解题,那么我们怎么优化算法呢?关键在于发现上面一题的算法中有什么是被重复计算的我们只要减少这些无用的运算,就能实现算法的时间复杂度优化。

为了方便叙述,我将山顶前面的部分称为上坡,山顶后面的部分称为下坡,很显然,上面算法在每次计算上坡/下坡时,总是不断的遍历之前就已经遍历过的元素,那么我们如何根据已经遍历过的元素来求出当前的上坡/下坡的高度呢?而且上坡和下坡的计算是分开的互不影响的,只要我们提前处理出各种上坡和下坡的高度,我们就能在O(n)的时间里得到最大高度。

如何利用之前遍历的元素信息,得到当前的上坡/下坡的高度?以计算上坡为例,解析如下

代码如下 

class Solution {
public:long long maximumSumOfHeights(vector<int>& maxHeights) {long long ans=0;int n=maxHeights.size();vector<long long>pre(n),suf(n);//分别代表以i为山顶的上坡和下坡stack<int>st;//里面存放下标,方便计算出栈个数和索引高度st.push(-1);//这里是为了方便计算,简化逻辑for(int i=0;i<n;i++){while(st.size()>1&&maxHeights[i]<maxHeights[st.top()])st.pop();int idx=st.top();pre[i]=(idx<0?0:pre[idx])+1LL*(i-st.top())*maxHeights[i];st.push(i);}st=stack<int>();//让栈为空st.push(n);//这里是为了方便计算,简化逻辑for(int i=n-1;i>=0;i--){while(st.size()>1&&maxHeights[i]<maxHeights[st.top()])st.pop();int idx=st.top();suf[i]=(idx==n?0:suf[idx])+1LL*(st.top()-i)*maxHeights[i];st.push(i);}for(int i=0;i<n;i++){ans=max(ans,pre[i]+suf[i]-maxHeights[i]);}return ans;}
};

这里说明一下算法的时间复杂度为O(n),有人或许看到求pre/suf中有两层循环,就认为时间复杂度为O(n^2),但其实不是,我们来看一下while循环里面的出栈语句执行了多少次,因为我们入栈的元素是n个,所以出栈的元素也只能是n个,所以这条语句只能执行n次,所以时间复杂度为O(n)

四、统计树种的合法路径数量

这题求路径个数,首先读懂题意,要求路径上包含一个质数,那么我们是从质数出发好,还是从非质数出发好呢?我们只要稍稍想一下就会发现从质数出发好,因为这样我们只要找到下一个质数就停止,而从非质数出发,我们就需要连续找到两个质数,很显然从非质数出发要处理的情况更多,所以我们从质数出发找路径,当然注意这题的路径至少需要两个结点(看示例一)

那么我们从质数出发怎么算呢?(判断质数就不讲了,不会的可以去看Leetcode-352周赛的第二题)

其他的路径求解方法同上,代码如下

//埃氏筛
const int MX=1e5;
vector<bool>is_prime(MX+1,true);
int init=[](){is_prime[1]=false;for(int i=2;i*i<=MX;i++){if(is_prime[i]){for(int j=i*i;j<=MX;j+=i){is_prime[j]=false;}}}return 0;
}();
class Solution {
public:long long countPaths(int n, vector<vector<int>>& edges) {vector<vector<int>>g(n+1);for(auto&e:edges){int x=e[0],y=e[1];g[x].push_back(y);g[y].push_back(x);}//计算质数结点连接的每一个子树中的非质数结点个数vector<int>sz(n+1);vector<int>nodes;function<void(int,int)> dfs=[&](int x,int fa){nodes.push_back(x);for(int y:g[x])if(y!=fa&&!is_prime[y])dfs(y,x);};long long ans=0;for(int x=1;x<=n;x++){if(!is_prime[x]) continue;int sum=0;for(int y:g[x]){if(is_prime[y]) continue;if(sz[y]==0){nodes.clear();dfs(y,-1);for(int z:nodes){sz[z]=nodes.size();}}    ans+=(long long)sum*sz[y];//以i为中间点的路径sum+=sz[y];}ans+=sum;//以i为端点的路径}return ans;}
};

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

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

相关文章

数据结构 | 二叉树

基本形状 可参照 数据结构&#xff1a;树(Tree)【详解】_数据结构 树_UniqueUnit的博客-CSDN博客 二叉树的性质 三种顺序遍历

区块链实验室(26) - 区块链期刊Blockchain: Research and Applications

Elsevier出版物“Blockchain: Research and Applications”是浙江大学编审的期刊。该期刊自2020年创刊&#xff0c;并出版第1卷。每年出版4期&#xff0c;最新期是第4卷第3期(2023年9月)。 目前没有官方的IF&#xff0c;Elsevier的引用因子Citescore是6.4。 虽然是新刊&#xf…

Android studio升级Giraffe | 2022.3.1 Patch 1踩坑

这里写自定义目录标题 not "opens java.io" to unnamed module错误报错信息解决 superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner报错报错信息解决 Android studio升级Giraffe | 2022.3.1 Patch 1后&#xff0c;出现项目…

ElementUI之CUD+表单验证

目录 前言&#xff1a; 增删改查 表单验证 前言&#xff1a; 继上篇博客来写我们的增删改以及表单验证 增删改查 首先先定义接口 数据样式&#xff0c;我们可以去elementUI官网去copy我们喜欢的样式 <!-- 编辑窗体 --><el-dialog :title"title" :visib…

MT8385 Android AB分区系统升级(命令模式)

AB系统分区升级使用的是update_engine,RecoverySystem 只适用于单分区的系统升级 1.解压开update.zip 可以查看到palyload的属性 2.使用ADB命令update_engine_client即可对AB分区进行升级 使用adb shell 命令进行升级 update_engine_client --payload xxx --update --hea…

Qt扩展-QCustomPlot绘图基础概述

QCustomPlot绘图基础概述 一、概述二、改变外观1. Graph 类型2. Axis 坐标轴3. 网格 三、案例1. 简单布局两个图2. 绘图与多个轴和更先进的样式3. 绘制日期和时间数据 四、其他Graph&#xff1a;曲线&#xff0c;条形图&#xff0c;统计框图&#xff0c;… 一、概述 本教程使用…

Error: node: unknown or unsupported macOS version: :dunno 错误解决

一、原因 今天安装 brew install node报错了&#xff0c;错误信息如下&#xff1a; 二、解决方案 1&#xff09;查找homebrew-cask安装位置 echo $(brew --repo homebrew/homebrew-cask) // 输出 /opt/homebrew/Library/Taps/homebrew/homebrew-cask2&#xff09;使用 gi…

linux 查看CPU架构是AMD还是ARM

要查看 Linux 系统的 CPU 架构是 AMD 还是 ARM&#xff0c;可以使用以下命令&#xff1a; 使用 lscpu 命令并查找 Architecture 字段&#xff1a; lscpu | grep Architecture如果输出结果中包含 x86_64 或 i686&#xff0c;则表示系统的 CPU 架构是 AMD&#xff08;或者是 x86…

wxWidgets(1):在Ubuntu 环境中搭建wxWidgets 库环境,安装库和CodeBlocks的IDE,可以运行demo界面了,继续学习中

1&#xff0c;选择使用 wxWidgets 框架 选择这个主要是因为完全的开源&#xff0c;不想折腾 Qt的库&#xff0c;而且打包的文件比较大。 网络上面有很多的对比&#xff0c;而且使用QT的人比较多。 但是我觉得wxwidgets 更加偏向 c 语法本身&#xff0c;也有助学习C。 没有太多…

Java安全之servlet内存马分析

目录 前言 什么是中间键 了解jsp的本质 理解servlet运行机制 servlet的生命周期 Tomcat总体架构 查看Context 的源码 servlet内存马实现 参考 前言 php和jsp一句话马我想大家都知道&#xff0c;早先就听小伙伴说过一句话木马已经过时了&#xff0c;现在是内存马的天下…

Snapdragon Profiler分析Android GPU

Snapdragon Profiler&#xff08;骁龙分析器&#xff09;是一款性能分析软件&#xff0c;在Windows、 Mac、和 Linux平台上都可以运行&#xff0c;主要是用来分析使用了高通骁龙处理器的Android设备。 Snapdragon Profiler通过USB连接这些Android设备&#xff0c;开发者可以用…

机器人过程自动化(RPA)入门 7. 处理用户事件和助手机器人

在UiPath中,有两种类型的Robot用于自动化任何流程。一个是后台机器人,它在后台工作。它独立工作,这意味着它不需要用户的输入或任何用户交互。另一个是前台机器人,也被称为助理机器人。 本章介绍前台机器人。在这里,我们将了解自动化过程中通过简单按键、单击鼠标等触发事…

MyBatisPlus(七)等值查询

等值查询 条件查询&#xff1a;使用 Wrapper 对象&#xff0c;传递查询条件。 QueryWrapper&#xff08;不要使用&#xff09; 代码 Testvoid eq() {QueryWrapper<User> wrapper new QueryWrapper<>();wrapper.eq("name", "张三");List<…

常用SQL语法总结

1.库操作 1.1.创建数据库 CREATE DATABASE 语句用来创建一个新的数据库。 语法&#xff1a;CREATE DATABASE DatabaseName; DatabaseName 为数据库名字&#xff0c;它的名字必须是唯一的&#xff0c;不能和其它数据库重名。 1.2.删除数据库 DROP DATABASE语句用来删除已经…

嵌入式Linux应用开发-第十五章具体单板的按键驱动程序

嵌入式Linux应用开发-第十五章具体单板的按键驱动程序 第十五章 具体单板的按键驱动程序(查询方式)15.1 GPIO操作回顾15.2 AM335X的按键驱动程序(查询方式)15.2.1 先看原理图确定引脚及操作方法15.2.2 再看芯片手册确定寄存器及操作方法15.2.3 编程15.2.3.1 程序框架15.2.3.2 硬…

FFmpeg 命令:从入门到精通 | ffplay 简单过滤器

FFmpeg 命令&#xff1a;从入门到精通 | ffplay 简单过滤器 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 简单过滤器视频旋转视频反转视频旋转和反转音频变速播放视频变速播放音视频同时变速更多参考 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 简单过滤器 本节介绍了简…

Qt扩展-QCustomPlot 用户交互

QCustomPlot 用户交互 一、概述二、操作范围三、选择机制1. 控制Graph的可选择性和选择状态2. 所选对象的外观3. 多部分对象4. 对选择变化做出反应 四、用户交互信号 一、概述 QCustomPlot提供了多个内置的用户交互。它们大致可以分为 通过用鼠标拖动和滚动鼠标滚轮进行范围操…

【单片机】12-串口通信和RS485

1.通信有关的常见概念 区分&#xff1a;串口&#xff0c;COM口&#xff0c;UART&#xff0c;USART_usart和串口区别-CSDN博客 串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客 1.什么是通信 &#xff08;1&#xff09;人和人之间的通信&#xff1a;说话&#xff…

在枚举类中“优雅地”使用枚举处理器

使用枚举类的一大好处就是&#xff0c;代码易懂&#xff0c;方便自己或他人维护。如&#xff0c;枚举状态、异常等。 下面有两个类&#xff08;枚举类和实体类&#xff09;&#xff1a; package com.zhang.enums;import lombok.Getter;/*** Author lgz* Description* Date 202…

计算机网络之传输层

计算机网络 - 传输层 计算机网络 - 传输层 UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 可靠传输TCP 滑动窗口TCP 流量控制TCP 拥塞控制 1. 慢开始与拥塞避免2. 快重传与快恢复 网络层只把分组发送到目的主机&#xff0c;但是真正通信的并不是…