Leetcode---365周赛

news2025/2/23 17:07:31

题目列表

2873. 有序三元组中的最大值 I

2874. 有序三元组中的最大值 II

2875. 无限数组的最短子数组

2876. 有向图访问计数

 一、有序三元组中的最大值I

 看一眼该题的数据范围,直接三层for循环暴力枚举,时间复杂度O(n^3),代码如下

class Solution {
public:
    long long maximumTripletValue(vector<int>& nums) {
        long long ans=0;
        for(int i=0;i<nums.size();i++){
            for(int j=i+1;j<nums.size();j++){
                for(int k=j+1;k<nums.size();k++){
                    ans=max(ans,1LL*(nums[i]-nums[j])*nums[k]);
                }
            }
        }
        return ans;
    }
};

二、有序三元组的最大值II

题目同上一题,只有数据范围不同

同一个题,数据范围变大之后,再用暴力就会超时,我们要想想怎么优化时间复杂度 ?

这里有三种思路:

1.我们枚举i,看j,k怎么选?

2.我们枚举j,看i,k怎么选?

3.我们枚举k,看i,j怎么选?

假设我们选择方案一:枚举i(即先确定一个nums[ i ]),那么nums[ j ]和nums[ k ]要如何选?才能让三元组的值最大,显然nums[ j ]要选最小的,nums[ k ]选最大的,这样三元组值最大,但是还有一个条件j<k,这就很难办了, 因为我们不能确定要选择的最小值和最大值的位置关系,所以方案一不选

假设我们选择方案二:枚举j(即先确定一个nums[ j ]),那么nums[ i ]和nums[ k ]要如何选?才能让三元组的值最大,显然nums[ i ]选最大的,nums[ k ]也选最大的,这样三元组值最大,并且i<j<k,即我们选取的nums[ i ]和nums[ k ]是互不影响的,我们只要预处理出前i个元素的最大值,和后i个元素的最大值,就能在O(n)的时间复杂度内找到答案,代码如下

class Solution {
public:
    long long maximumTripletValue(vector<int>& nums) {
        int n=nums.size();
        long long ans=0;
        vector<int>pre(n+1),suf(n);
        pre[0]=0;
        for(int i=0;i<n;i++)
            pre[i+1]=max(pre[i],nums[i]);
        for(int i=n-1;i>=1;i--)
            suf[i-1]=max(suf[i],nums[i]);
        for(int j=0;j<n;j++)
            ans=max(ans,1LL*(pre[j]-nums[j])*suf[j]);
        return ans;
    }
};

//当然这里的前缀最大值数组还可以优化掉
class Solution {
public:
    long long maximumTripletValue(vector<int>& nums) {
        int n=nums.size();
        long long ans=0;
        vector<int>suf(n);
        for(int i=n-1;i>=1;i--)
            suf[i-1]=max(suf[i],nums[i]);
        for(int j=1,pre=nums[0];j<n;j++){
            ans=max(ans,1LL*(pre-nums[j])*suf[j]);
            pre=max(pre,nums[j]);
        }
        return ans;
    }
};

假设我们选择方案三:枚举k(即先确定一个nums[ k ]),那么nums[ i ]和nums[ j ]要如何选?才能让三元组的值最大,即nums[ i ] - nums[ j ]要最大,那么这不就是在遍历的过程中,维护一个前缀最大值和一个最大高度差吗,(估计有人不太能理解,我画个折线图,大家应该能好懂一些,思路和121. 买卖股票的最佳时机很相似)

代码如下

class Solution {
public:
    long long maximumTripletValue(vector<int>& nums) {
        int n=nums.size();
        long long ans=0;
        for(int k=0,pre=0,diff=0;k<n;k++){
            ans=max(ans,1LL*diff*nums[k]);
            diff=max(diff,pre-nums[k]);
            pre=max(pre,nums[k]);
        }
        return ans;
    }
};

(大家可以试着将第二题的代码放到第一题去跑一跑,对比一下两者的时间,感受一下算法的魅力) 

三、无限数组的最短子数组

看到找最短的子数组的和等于target,第一个想到的就是滑动窗口,当然这题和正常的滑窗有点不同,它给的数组是个可以循环的无限长数组。

我们要弄明白两个问题:

1.我们需要一直遍历到无限远吗?不需要,我们的left端点只要在2倍的该数组里面遍历就行,因为一旦超过这个范围,后面的就又会开始循环之前遍历的结果,没有任何意义。

2.如果target>=sum(nums) ,我们的子数组还需要从0开始增加长度吗?不用,因为不论怎么枚举,子数组的长度都会有length(nums)*(target/sum(nums))的基础长度,我们只要关心target%sum(nums)这部分的最小子数组的长度就可以了,这样我们就将子数组差分成了两个部分,一个是以整个数组为单位的,一个是单独考虑的。

当然肯定有人会怀疑我们这种想法是不是太想当然了,万一这两部分不能形成一个子数组怎么办?好,这里我们就构造一个这样的子数组,我们假定找到了单独考虑的那部分子数组,然后我们继续向后延伸,由于数组是循环的,所以我们总能找到和原数组长度一样的,值相等的区间,如此循环就能构造出我们想要的最短子数组,即上面的想法正确

代码如下

class Solution {
public:
    typedef long long LL;
    int minSizeSubarray(vector<int>& nums, int target) {
        LL sum=accumulate(nums.begin(),nums.end(),0LL);
        int n=nums.size();
        int s=0,ans=INT_MAX;
        for(int left=0,right=0;right<2*n;right++){
            s+=nums[right%n];
            while(s>(target%sum)){
                s-=nums[left%n];
                left++;
            }
            if(s==(target%sum)) ans=min(ans,right-left+1);
        }
        if(ans==INT_MAX)return -1;
        return ans+target/sum*n;
    }
};

四、有向图访问计数

这是一个求每个结点向下能访问多少个不同结点的问题,我们需要用拓扑排序将每个环从图中拆下来单独考虑,得到换上每个结点的访问个数,然后利用返图,计算不在环上的点的访问个数,

代码如下

class Solution {
public:
    vector<int> countVisitedNodes(vector<int>& edges) {
        int n=edges.size();
        vector<vector<int>>g(n);//反图
        vector<int>deg(n);//入度
        for(int i=0;i<n;i++){
            g[edges[i]].push_back(i);
            deg[edges[i]]++;
        }
        
        //拓扑排序
        queue<int>q;//存放入读为0的点
        for(int i=0;i<n;i++){
            if(deg[i]==0)
                q.push(i);
        }

        //将不在环上的结点从图中去掉,指的是将结点的入度设置为0
        while(!q.empty()){
            int x=q.front();
            q.pop();
            if(--deg[edges[x]]==0)
                q.push(edges[x]);
        }
        
        vector<int>ans(n);
        //计算不在环上的点
        function<void(int,int)>dfs=[&](int x,int depth){
            ans[x]=depth;
            for(int y:g[x]){
                if(deg[y]==0){//环上的点入度为-1,这里只遍历不在环上的点
                    dfs(y,depth+1);
                }
            }
        };

        for(int i=0;i<n;i++){
            if(deg[i]<=0) continue;
            //先计算环上的点的个数
            vector<int>node;
            for(int x=i;;x=edges[x]){
                node.push_back(x);
                deg[x]=-1;//被计算过的环上的点的入度设为-1
                if(edges[x]==i)
                    break;
            }

            for(int x:node){
                dfs(x,node.size());
            }
        }
        return ans;
    }
};

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

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

相关文章

Avalonia常用小控件Svg

1.项目下载地址&#xff1a;https://gitee.com/confusedkitten/avalonia-demo 2.UI库Semi.Avalonia&#xff0c;项目地址 https://github.com/irihitech/Semi.Avalonia 3.SVG库&#xff0c;Avalonia.Svg.Skia&#xff0c;项目地址 https://github.com/wieslawsoltes/Svg.Ski…

淘宝店铺商品评论数据采集,淘宝商品评论数据接口,淘宝API接口

采集淘宝店铺商品评论数据的方法如下&#xff1a; 进入主界面&#xff0c;选择"自定义任务"。将商品信息页的网址复制粘贴到网站输入框中&#xff0c;点击"保存设置"。将页面下拉到底部&#xff0c;点击"下一页"按钮&#xff0c;在右侧的操作提…

IDEA 中SpringBoot对Run/Debug Configurations配置 SpringBoot的多环境参数指定

例如下面中有多种环境&#xff1a;dev、test、prod 等配置参数&#xff0c;运行服务时候指定其中一种 VM options:内部配置参数 -Dspring.config.namebootstrap -Dspring.spring.profilesdev # 也可以指定端口 -Dserver.port8080 -Dspring.profiles.activetest -Ddebug 参考链…

校招C#面试题整理—Unity客户端

前言 博客已经1年多没有更新了&#xff0c;这一年主要在实习并准备秋招和春招&#xff0c;目前已经上岸Unity客户端岗位&#xff0c;现将去年校招遇到的一些面试题的事后整理分享出来。答案是笔者自己整理的不一定保证准确&#xff0c;欢迎大家在评论区指出。 Unity客户端岗的…

【小巧玲珑】文件太大,怎么办?分卷压缩技术了解下,这才是压缩技术

【小巧玲珑】文件太大&#xff0c;怎么办&#xff1f;分卷压缩技术了解下&#xff0c;这才是压缩技术 1、痛点2、场景重现2.1 jar包2.1 ZIP压缩 3、压缩步骤3.1 新建压缩文件3.2 压缩结果 4、解压步骤5、效果6、jar压缩算法 1、痛点 通过浏览器客户端访问云服务&#xff0c;文…

【VR】【Unity】白马VR课堂系列-VR开发核心基础03-项目准备-VR项目设置

【内容】 详细说明 在设置Camera Rig前,我们需要针对VR游戏做一些特别的Project设置。 点击Edit菜单,Project Settings,选中最下方的XR Plugin Management,在右边面板点击Install。 安装完成后,我们需要选中相应安卓平台下的Pico VR套件,关于怎么安装PICO VR插件,请参…

硬盘格式化怎么选?NTFS/FAT32/exFAT

我们在初次使用硬盘时需要进行格式化&#xff0c;很多移动硬盘和U盘在使用时也有格式化的需求&#xff0c;不过在格式化的时候会面临3个选项&#xff0c;分别是FAT32、NTFS和exFAT&#xff0c;他们到底有什么区别&#xff0c;我们应该如何选呢&#xff1f; 首先简单介绍一下文件…

顶灯控制器OHC

OHC(Over Head Console)顶部控制终端系统&#xff0c;主要实现对车内饰灯以及天窗的控制功能。OHC产品采用平台化设计&#xff0c;并已通过多家整车厂的设计评审和试验验证&#xff0c;为特斯拉、福特、林肯、捷豹、路虎若干车型配套。 产品应用 车内照明灯控制天窗控制后排照…

网站的常见攻击与防护方法

在互联网时代&#xff0c;几乎每个网站都存在着潜在的安全威胁。这些威胁可能来自人为失误&#xff0c;也可能源自网络犯罪团伙所发起的复杂攻击。无论攻击的本质如何&#xff0c;网络攻击者的主要动机通常是谋求经济利益。这意味着无论您经营的是电子商务项目还是小型商业网站…

mongoDB 性能优化

文章目录 前言mongoDB 性能优化1. explain方法来查看查询的执行计划2. 查看mongoDB 集合的索引3. mongoDB 怎么添加索引4. 升序索引与降序索引是什么意思 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易…

Linux - make命令 和 makefile

make命令和 makefile 如果之前用过 vim 的话&#xff0c;应该会对 vim 又爱又恨吧&#xff0c;刚开始使用感觉非常的别扭&#xff0c;因为这种编写代码的方式&#xff0c;和在 windows 当中用图形化界面的方式编写代码的方式差别是不是很大。当你把vim 用熟悉的之后&#xff0…

专业韩语论文翻译,论文中译韩哪里比较专业?

据了解&#xff0c;论文翻译是翻译工作中较常见的一种翻译题材&#xff0c;论文翻译的主要目的是在国外期刊上发表&#xff0c;加强国际学术交流。那么&#xff0c;如何做好论文翻译&#xff0c;论文中译韩哪里比较专业&#xff1f; 业内人士指出&#xff0c;翻译韩语论文&…

pycharm2020无法打开,点击无反应

pycharm 2020 无法打开&#xff0c;点击无反应&#xff0c;今天我碰到这现象&#xff0c;总结大体原因 C:\Users\ygw\AppData\Roaming\JetBrains &#xff08;删除该目录即可&#xff0c;一般由于升级安装 或 安装两个不同版本 会存在老旧文件影响导致&#xff09;

了解什么是JWT的原理及实际应用

目录 一、介绍&讲述 ( 1 ) 什么是JWT ( 2 ) 为什么要学 二、结构 三、Jwt的工具类的使用 1. 依赖 2. 工具类 3. 过滤器 4. 控制器 5. 配置 6. 测试类 用于生成JWT 解析Jwt 复制jwt&#xff0c;并延时30分钟 测试JWT的有效时间 测试过期JWT的解析 四、…

智能制造优化,RFID生产线管理系统解决方案

一、背景介绍 随着全球经济的发展&#xff0c;传统制造业面临着越来越高的成本和低利润的挑战&#xff0c;为了提升企业的整体利润率&#xff0c;优化管理流程成为必要的手段之一&#xff0c;在传统的制造企业中&#xff0c;生产线通常采用单件流生产模式&#xff0c;但这种模…

成立 15 年的美图分享,AI 视觉大模型的核心能力是什么?

出品 | CSDN 云计算 国民级美颜修图软件美图秀秀&#xff0c;从移动互联网时代火到现在&#xff0c;而它背后的美图公司也走过了十五年的发展&#xff0c;旗下拥有众多的专业影像与设计产品。最近&#xff0c;美图公司举办 15 周年生日会&#xff0c;生日会上美图还发布了自研 …

深度学习基础知识数据 数据预处理transforms流程讲解

深度学习基础知识数据 数据预处理transforms流程讲解 1、数据预处理2、使用节点2、transform.RandomResizedCrop 随机尺寸裁剪缩放3、水平翻转 与 垂直翻转4、ColorJitter变换5、ToTensor6、Normalization 归一化7、transforms.Compose8、重写transforms1、分类任务2、目标检测…

“Jwt认证在前后端分离架构中的应用与优化“

目录 引言1. JWT的简介1.1 什么是JWT1.2 JWT的优势 2. JWT工具类2.1 JWT生成与解析2.2 JWT与安全性 3. JWT案例演示后台改动前台改动 总结 引言 在当今互联网应用开发中&#xff0c;前后端分离架构已经成为一种主流的开发模式。而身份验证和授权是保证系统安全性的重要环节之一…

Unity 快捷键的一些记录

1.Unity Prefab Apply All 设置快捷键&#xff0c;修改预设体之后快捷键应用 打包会出问题&#xff1a;The type or namespace name ‘EditorWindow‘ could not be found EditorWindow类无法打包出EXE 添加unity关键字定义如下文所示&#xff1a; #if UNITY_EDITOR using Uni…

「五度情报站」网罗全量企业情报,找客户、查竞品、寻商机!

在当下严峻的市场经济环境下&#xff0c;准确、及时的情报信息&#xff0c;就如同指引企业前行的明灯&#xff0c;能够让企业在风起云涌的市场大潮中保持敏锐的洞察力&#xff0c;掌握最新的市场动态&#xff0c;洞悉竞争对手的一举一动&#xff0c;先知先动&#xff0c;保持竞…