LeetCode---120双周赛

news2024/11/26 22:31:01

题目列表

2970. 统计移除递增子数组的数目 I

2971. 找到最大周长的多边形

2972. 统计移除递增子数组的数目 II

2973. 树中每个节点放置的金币数目

一、统计移除递增子数组的数目I

这题的数据范围不高,可以直接暴力,后面的第三题和它一样,但是数据范围增强,这里先写一种暴力的解法,后面第三题在讲个O(n)的解法

class Solution {
public:
    int incremovableSubarrayCount(vector<int>& nums) {
        int n=nums.size();
        int ans=0;
        //枚举删除的子数组的左右断点[i,j]
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++){
                bool flag=true;
                vector<int>v(nums.begin(),nums.begin()+i);
                v.insert(v.end(),nums.begin()+j+1,nums.end());
                for(int k=0;k<v.size();k++){
                    if(k&&v[k]<=v[k-1]){
                        flag=false;
                        break;
                    }
                }
                ans+=flag;
            }
        }
        return ans;
    }
};

二、找到最大周长的多边形

这题的难度不高,题目意思说的很明确,我们只要照着模拟就行,用贪心的思想:因为多边形的周长要最长,我们肯定是先考虑全选的情况,然后看是否符合多边形的条件,如果不符合,我们只能将最长的边换小一点,同时比最长边小的边全部选上,这样不等式左边的数的和才会尽可能的大,会更有可能满足多边形的条件

代码如下

class Solution {
public:
    long long largestPerimeter(vector<int>& nums) {
        int n=nums.size();
        sort(nums.begin(),nums.end());
        long long sum=accumulate(nums.begin(),nums.end(),0LL);
        for(int i=n-1;i>1;i--){//多边形最少要三条边
            if(sum-nums[i]>nums[i])
                return sum;
            sum-=nums[i];
        }
        return -1;
    }
};

三、移除递增子数组的数目II

第一题的数据加强版,第一题我们是纯模拟,时间复杂度为O(n^3),很显然过不了,所以我们要观察它给的示例,来找找规律

上面只截取了示例1,是一个特殊情况,当数组本身就是递增的情况下,答案就是数组能产生多少个子数组,为(n+1)*n/2

那么如果数组不严格单调增呢?

我们可以将子数组分为三种:

1、右端点固定在数组最右边,看前缀的递增数组能到哪里

2、左端点固定在数组最左边,看后缀的递增数组能到哪里

3、子数组在数组的中间

前面两种情况很好解决,第三种情况怎么求?

首先我们要明确一点,由于我们是在中间找子数组,所以数组的前缀和后缀一定要是递增的,我们只要看前缀的最后一个数是否比后缀的第一个数大就行。

同时为了得到子数组的数量和降低时间复杂度,我们可以用双指针(同向双指针),这里用到前缀/后缀数组的单调性,可以简单说明一下该算法的步骤和正确性

设i为a数组的下标,j为b数组的下标,都从前往后移动,两个数组同时满足单调增

  • 如果a[i]<b[j],根据单调性,j后面的数字一定也满足小于关系,所以直接加上后面的数字个数,同时i++,看看a数组的下一个数字是否也小于b[j]
  • 如果a[i]>=b[j],根据单调性,j前面的数字也一定满足大于等于关系,所以直接让j++

总而言之,我们在遍历a数组的同时,让b数组中的数始终被划分为可能满足条件和永远不可能满足条件两个部分,时间复杂度的降低本质在于永远不能满足条件的部分不会被重复的遍历到

代码如下

class Solution {
public:
    long long incremovableSubarrayCount(vector<int>& nums) {
        int n=nums.size();
        //找前缀递增的最后一个元素下标
        int i=0;
        while(i<n-1){
            if(nums[i]>=nums[i+1])
                break;
            i++;
        }

        if(i==n-1) return 1LL*n*(n+1)/2;

        //找后缀递增的第一个元素下标
        int j=n-1;
        while(j>0){
            if(nums[j-1]>=nums[j])
                break;
            j--;
        }

        //要考虑将整个数组变成空数组的情况,所以单独+1
        long long ans=(n - j) + (i + 1) + 1;
        int l=0,r=j;
        while(l<=i&&r<n){
            if(nums[l]<nums[r]){
                ans+=(n-r);
                l++;
            }else{
                r++;
            }
        }
        return ans;
    }
};

(当然,双指针同时从后往前遍历也是可以的,这样可以将找递增后缀和双指针结合起来写,有兴趣的读者可以回去试着去改改代码) 

四、树中每个节点放置的金币数目

这题说实在的没有什么难点,关键是你要知道如何建图和遍历这棵树。

还有一个比较关键的点简单说明一下:当子树中的结点个数>=3时,我们如何选取3个数字使得它们的乘积最大?这其实很好思考,我们只要将数组排序,因为题目要求小于0,就放置0个金币,所以我们只要考虑选三个数字,它们的乘积为最大的正整数即可,

两种可能性:

  • 三个数都为正,选择最大的三个数
  • 三个数中两个数为负,选最小的两个数,一个数为正,选一个最大的数

至于这两种情况中是否会出现三个数全为负数的情况,我们根本不用管,因为题目要求小于0,就放置0个金币。

有人可能也是这样写的,但是超时了没过,这里讲一下为什么,因为数组太大了,排序需要时间,但其实我们没必要将子树的所有cost都排序,我们只想知道这些数字中最小的两个数和最大的三个数(当然要考虑到重合的情况,因为我们不能凭空多出数字)。

代码如下

class Solution {
public:
    vector<long long> placedCoins(vector<vector<int>>& edges, vector<int>& cost) {
        int n=cost.size();
        vector<long long>ans(n);
        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);
        }
        
        function<vector<long long>(int,int)>dfs=[&](int x,int fa)->vector<long long>{
            vector<long long>v({cost[x]});
            for(int y:g[x]){
                if(y!=fa){
                    vector<long long>w=dfs(y,x);
                    v.insert(v.end(),w.begin(),w.end());
                }
            }
            int m=v.size();
            if(m<3)
                ans[x]=1;
            else{
                sort(v.begin(),v.end());
                long long a=v[m-1]*v[m-2]*v[m-3];
                long long b=v[0]*v[1]*v.back();
                ans[x]=max(max(a,b),0LL);
            }
            if(m>5){
                v.erase(v.begin()+2,v.end()-3);
            }
            return v;
        };
        
        dfs(0,-1);
        return ans;
    }
};

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

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

相关文章

程序员面试笔试通关宝典系列丛书(由清华大学出版社出版)

程序员面试笔试通关宝典系列——编程职场成功的必备秘籍 由清华大学出版社出版的专为编程爱好者和职业开发者打造的“程序员面试笔试通关宝典”系列丛书。该系列包含五本专业指南&#xff0c;覆盖数据库、Java、前端、通用编程和Python五个领域。 这些书籍深度解析各领域的核…

面试题:MySQL 自增主键一定是连续的吗?

文章目录 测试环境&#xff1a;一、自增值的属性特征&#xff1a;1. 自增主键值是存储在哪的&#xff1f;2. 自增主键值的修改机制&#xff1f; 二、新增语句自增主键是如何变化的&#xff1a;三、自增主键值不连续情况&#xff1a;&#xff08;唯一主键冲突&#xff09;四、自…

AIGC开发:调用openai的API接口

简介 开始进行最简单的使用&#xff1a;通过API调用openai的模型能力 OpenAI的能力如下图&#xff1a; 文本生成模型 OpenAI 的文本生成模型&#xff08;通常称为生成式预训练 Transformer 或大型语言模型&#xff09;经过训练可以理解自然语言、代码和图像。这些模型提供文…

扫雷(c语言)

先开一个test.c文件用来游戏的逻辑测试&#xff0c;在分别开一个game.c文件和game.h头文件用来实现游戏的逻辑 主要步骤&#xff1a; 游戏规则&#xff1a; 输入1&#xff08;0&#xff09;开始&#xff08;结束&#xff09;游戏&#xff0c;输入一个坐标&#xff0c;如果该坐…

新药(化药)注册申报资料都包含哪些?

新药的注册申报是新药上市前的重要步骤,其流程可以简单概括为①前期准备→②申报材料准备→③递交注册申请→④审评和审批→⑤监管和跟踪。本文将着重介绍新药(化药)注册申报的一般流程和主要环节(附流程图)。(关于新药注册申报成功率和耗费时间问题写到最后) ①前期准备 在开…

年底医保新改革,如何短,平,快搞定his医保接口升级

1. 先说说我负责运维的医院背景&#xff1a; 省会中心城市三甲&#xff0c;电脑共计1500台左右。其中安装有his系统的电脑大约600台&#xff0c;也就是说需要给600台医护人员使用电脑进行医保接口升级。 近期有幸参与了院里HIS系统的升级工作&#xff0c;赶上特殊时期&#x…

数字身份验证:跨境电商如何应对账户安全挑战?

在数字化时代&#xff0c;随着跨境电商的蓬勃发展&#xff0c;账户安全问题逐渐成为行业和消费者关注的焦点。随着网络犯罪日益猖獗&#xff0c;用户的数字身份安全面临着更加复杂的威胁。本文将深入探讨数字身份验证在跨境电商中的重要性&#xff0c;并探讨各种创新技术和策略…

SQL Server 索引和视图

CSDN 成就一亿技术人&#xff01; 难度指数&#xff1a;* * * CSDN 成就一亿技术人&#xff01; 目录 1.索引 什么是索引&#xff1f; 索引的作用&#xff1f; 索引的分类 1. 唯一索引 2. 主键索引 3. 聚集索引 4.非聚集索引 5.复合索引 6.全文搜索 索引的创建&am…

docker-compose部署zabbix服务

1.首先要有docker环境&#xff0c; 关闭防火墙&#xff0c;selinux 开启docker&#xff0c;并设置开机自启动 Linux的docker的安装https://blog.csdn.net/m0_58146415/article/details/134654933 2.docker-compose的安装----github下载 curl -SL https://github.com/docke…

Unity Shader-真实下雨路面

Unity Shader-真实下雨路面 简介素材1.准备插件Amplify Shader Editor&#xff08;这里我使用的是1.6.4最新版&#xff09;2.贴纸和切图d 一、创建一个Shader Surface&#xff0c;实现气泡播放效果二、叠加一次气泡播放效果&#xff0c;使其看起来更多&#xff0c;更无序三、小…

【C++入门(一)】:详解C++语言的发展及其重要性

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f324;️什么是C&#x1f324;️C的发展史&#x1f324;️C的重要性☁️语言的广泛度☁️C的领域⭐…

鸿蒙系列--组件介绍之容器组件

一、Badge 描述&#xff1a;给其他组件添加标记 子组件&#xff1a;支持单个子组件 1.创建数字标记 Badge(value: {count: number, position?: BadgePosition, maxCount?: number, style: BadgeStyle}) 2.创建字符串标记 Badge(value: {value: string, position?: Badge…

62元一年的腾讯云轻量2核2G3M服务器性能测评

阿里云轻量应用服务器2核2G3M带宽优惠价格62元一年&#xff0c;100%CPU性能&#xff0c;3M带宽下载速度384KB/秒&#xff0c;40GB SSD系统盘&#xff0c;月流量200GB&#xff0c;折合每天6.6GB流量&#xff0c;超出月流量包的流量按照0.8元每GB的价格支付流量费&#xff0c;地域…

算法基础day2

前缀和 #include <iostream> using namespace std; const int N100010; int n,m; int a[N],s[N]; int main() {scanf("%d%d",&n,&m);for(int i1;i<n;i) scanf("%d",&a[i]);for(int i1;i<n;i) s[i]s[i-1]a[i];while(m--){int l,r;s…

鸿鹄电子招投标系统:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台源码与立项流程

在数字化时代&#xff0c;企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台&#xff0c;涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

单机+内部备份_全备案例

此场景为单机数据库节点内部备份&#xff0c;方便部署和操作&#xff0c;但备份REPO与数据库实例处于同一个物理主机&#xff0c;冗余度较低。 前期准备 配置ksql免密登录(必须) 在Kingbase数据库运行维护中&#xff0c;经常用到ksql工具登录数据库&#xff0c;本地免密登录…

将H5封装为App:实现跨平台移动应用开发的新趋势

H5技术指的是HTML5、CSS3和JavaScript等一系列前端技术的综合应用。它具有跨平台、开发成本低、开发周期短等优势&#xff0c;可以快速实现丰富的界面和交互效果。而原生应用开发受限于操作系统的差异&#xff0c;需要分别开发不同平台的应用&#xff0c;这就增加了开发成本和工…

车联网的安全风险与应对措施

安全风险 1、恶意软件 攻击者可以通过入侵厂商或供应商网络&#xff0c;用恶意软件&#xff08;如病毒、木马、勒索软件等&#xff09;感染车联网系统组件&#xff0c;从而获得对车辆的控制权或窃取敏感信息。例如&#xff0c;一名安全研究人员成功入侵了特斯拉&#xff08;T…

第八届视觉、图像与信号处理国际会议(ICVISP 2024) | Ei, Scopus双检索

会议简介 Brief Introduction 2024年第八届视觉、图像与信号处理国际会议(ICVISP 2024) 会议时间&#xff1a;2024年12月27日-29日 召开地点&#xff1a;中国西双版纳 大会官网&#xff1a;ICVISP 2024-2024 8th International Conference on Vision, Image and Signal Process…