Leetcode---352周赛

news2024/12/25 12:51:48

周赛题目

2760. 最长奇偶子数组

2761. 和等于目标值的质数对

2762. 不间断子数组

2763. 所有子数组中不平衡数字之和

一、最长奇偶子数组

 这题的数据范围允许用暴力来做,只要我们分别枚举左端点left和右端点right,然后看区间[left,right]是否符合题目条件,然后找到最大值了返回就行,这里就不多做解释了,下面讲解一种更快的算法---滑动窗口

思路:我们先找到符合条件的左端点,再不断向右扩展右端点,并不断更新最长子数组的长度,直到遇到不符合条件的数出现,我们再移动左端点,使得区间再次符合条件,然后继续移动右端点,如此循环,最后返回得到的最长子数组的长度

代码如下

int longestAlternatingSubarray(int* nums, int numsSize, int threshold){
    int right=0;
    int ans=0;
    while(right<numsSize){
        //找到符合条件的左端点
        if(nums[right]>threshold||nums[right]%2){
            right++;
            continue;
        }
        int left=right;
        right++;
        while(right<numsSize&&nums[right]<=threshold&&(nums[right-1]%2)!=(nums[right]%2)){ 
            right++;
        }
        ans=fmax(ans,right-left);
    }
    return ans;
}

二、和等于目标值的质数对

 这题其实也不难,主要是质数的判断比较费时间,如果我们一个个去比较,那么时间很可能会超时,这里需要用埃氏筛或者线性筛,来提前预处理出那些素数

这里简单说明一下埃氏筛的思路:默认所有的数都是素数(即标记为true),从2开始枚举,将2放入素数集合中,再将范围内所有2的倍数标记为false,然后下一个枚举的数是如果是true,就加入素数集合,并将其在范围内的所有倍数标记为false,如果是false,就将其在范围内的所有倍数标记为false,如此循环,就得到了范围内所有的素数

代码如下

int** findPrimePairs(int n, int* returnSize, int** returnColumnSizes){
    bool prime[n+1];
    for(int i=0;i<=n;i++)
        prime[i]=true;
    for(int i=2;i<n;i++){
        for(int j=i;j<n/i+1;j++){//这里的写法可以防止越界
            prime[j*i]=false;
        }
    }
    int**ans=(int**)malloc(sizeof(int*)*100000);
    *returnSize=0;
    for(int i=2;i<n;i++){
        if(!prime[i])continue;
        if(n-i<i)break;
        if(prime[n-i]){
            int*tmp=(int*)malloc(sizeof(int)*2);
            tmp[0]=i,tmp[1]=n-i;
            ans[(*returnSize)++]=tmp;
        }
    }
    *returnColumnSizes=(int*)malloc(sizeof(int)*(*returnSize));
    for(int i=0;i<*returnSize;i++){
        (*returnColumnSizes)[i]=2;
    }
    return ans;
}

进阶:由于埃氏筛会导致有些数字被重复赋值为false,浪费了时间(如12=2*6=3*4),这里补充讲一下线性筛,也就是防止重复赋值的情况,我们该怎么办?我们只要将枚举到的数字和已经得到的质数相乘,且如果该质数是所枚举数字的因子,直接跳出循环即可,这个算法的证明有兴趣的同学可以自行去百度,这里就不做详细证明了,写一下代码

int** findPrimePairs(int n, int* returnSize, int** returnColumnSizes){
    bool is_prime[n+1];
    int primes[n];
    int k=0;
    for(int i=0;i<=n;i++)
        is_prime[i]=true;
    for(int i=2;i<n;i++){
        if(is_prime[i])
            primes[k++]=i;
        for(int j=0;j<k&&primes[j]*i<n;j++){
            is_prime[primes[j]*i]=false;
            if(i%primes[j]==0)
                break;
        }
    }
    int**ans=(int**)malloc(sizeof(int*)*100000);
    *returnSize=0;
    for(int i=2;i<n;i++){
        if(!is_prime[i])continue;
        if(n-i<i)break;
        if(is_prime[n-i]){
            int*tmp=(int*)malloc(sizeof(int)*2);
            tmp[0]=i,tmp[1]=n-i;
            ans[(*returnSize)++]=tmp;
        }
    }
    *returnColumnSizes=(int*)malloc(sizeof(int)*(*returnSize));
    for(int i=0;i<*returnSize;i++){
        (*returnColumnSizes)[i]=2;
    }
    return ans;
}

三、不间断子数组

我们先用个例子来找找思路

接下来,我们只需要维护一段区间上的最大值和最小值来保证区间合法就行,那么这题很显然要用到特殊的队列(优先队列)来维护变化区间上的最大值和最小值代码如下

long long continuousSubarrays(int* nums, int numsSize){
    long long ans=0;
    int n=numsSize;
    int q_Max[n],q_Min[n];
    int h1=0,t1=0,h2=0,t2=0;
    for(int left=0,right=0;right<numsSize;right++){
        while(h1<t1&&nums[q_Max[t1-1]]<nums[right]){
            t1--;
        }
        while(h2<t2&&nums[q_Min[t2-1]]>nums[right]){
            t2--;
        }
        q_Max[t1++]=right;
        q_Min[t2++]=right;
        while(h1<t1&&h2<t2&&nums[q_Max[h1]]-nums[q_Min[h2]]>2){
            if(q_Max[h1]<q_Min[h2]){
                h1++;
            }else{
                h2++;
            }
            //这里不用担心h1或者h2越界的问题,因为它们就算h1或者h2到达n-1,那么++的必然是另一个
            //而一旦h1=h2=n-1,就不符合最大值和最小值相差大于2的条件,不用进入循环
            left=fmin(q_Max[h1],q_Min[h2]);
        }
        ans+=right-left+1;
    }
    return ans;
}

四、2763. 所有子数组中不平衡数字之和

 

 这题的数据范围允许我们使用暴力做法,即直接枚举左右端点,依次计算每个区间的不平衡数字之和,将它们相加后返回,这里的问题就在于我们如何计算区间内的不平衡数字之和,很多人就会想到题目中要求排序,那我们也排序,但是一旦排序就会改变数组中数字的顺序,所以我们就需要额外空间来存放需要排序的数字,既增加空间复杂度,又增加了时间复杂度,这里其实不用这么复杂,我们继续来举个例子帮助大家打开思路

代码如下

int sumImbalanceNumbers(int* nums, int numsSize){
    int n=numsSize,ans=0;
    for(int i=0;i<n;i++){
        bool visited[n+2];
        memset(visited,false,sizeof(visited));
        visited[nums[i]]=true;
        int cnt=0;
        for(int j=i+1;j<n;j++){
            int x=nums[j];
            if(!visited[x]){
                cnt+=1-visited[x-1]-visited[x+1];
                visited[x]=1;
            }
            ans+=cnt;
        }
        
    }
    return ans;
}

//介绍另一种写法
int sumImbalanceNumbers(int* nums, int numsSize){
    int visited[numsSize+2];
    memset(visited,-1,sizeof(visited));
    int ans=0;
    for(int i=0;i<numsSize-1;i++){
        int cnt=0;
        visited[nums[i]]=i;
        for(int j=i+1;j<numsSize;j++){
            int x=nums[j];
            if(visited[x]!=i){
                cnt+=1-(visited[x-1]==i)-(visited[x+1]==i);
                visited[x]=i;
            }
            ans+=cnt;
        }
    }
    return ans;
}

那么有没有O(n)的方法呢?

其实这题还可以用贡献法来求解,即我们来单独讨论每个元素对不平衡数字之和的贡献。

算法的思想:假设我们要计算x这个数对数组不平衡数字的贡献,那么我们向左边寻找离x最近的x-1或x,在向右边寻找离x最近的x-1(之所以不找x+1,是因为当我们计算x+1这个数的贡献时,就会向左找x,所以没必要找,而右边不找x的理由同上)这样我们就能知道x存在的子数组的个数(用乘法原理),由此来推断x对不平衡数字的贡献,但是这有一个问题:当x是所在子数组的最小值时,它的贡献就是0,我们需要减去这部分多算的贡献,而每一个元素x充当最小值的子数组的数量就是原数组的子数组的数量,也就是n(n+1)/2---注意子数组要求连续

代码如下

int sumImbalanceNumbers(int* nums, int numsSize){
    int n=numsSize,ans=0;
    int left[n];
    int idx[n+1];
    memset(idx,-1,sizeof(idx));
    for(int i=0;i<n;i++){
        int x=nums[i];
        left[i]=fmax(idx[x-1],idx[x]);
        idx[x]=i;
    }
    for(int i=0;i<n+1;i++){
        idx[i]=n;
    }
    for(int i=n-1;i>=0;i--){
        int right=idx[nums[i]-1];
        ans+=(i-left[i])*(right-i);
        idx[nums[i]]=i;
    }
    return ans-n*(n+1)/2;
}

最后不要忘记点赞,评论加收藏哦!!!

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

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

相关文章

stable diffusion 百宝书

文章目录 0. 环境搭建0.1 Windows0.1.1 git环境安装0.1.2 python 环境搭建0.1.2.1 配置pip国内镜像源 0.1.3 stable diffusion环境搭建0.1.3.1 远程访问Stable diffusion0.1.3.2 模型 Lora下载 1. 基础知识1.1 Stable Diffusion Webui及基础参数1.2 参数说明1.2.1 采样方法1.2.…

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B 简介环境配置环境搭建依赖安装 代码及模型权重拉取拉取 Chinese-LLaMA-Alpaca拉取 llama-30b-hf 模型权重及代码拉取 chinese-llama-lora-33b 模型权重及代码 合并模型权重先转换 pth 类型的模型权重&…

docker版jenkins安装node打包vue2

下载node 通过jenkins配置下载因为某些原因会失败&#xff0c;故自己下载安装https://nodejs.org/zh-cn/download解压然后复制到docker的jenkins容器 tar -xvf node-v16.18.1-linux-x64.tar.xzdocker cp ./node-v16.18.1-linux-x64 jenkins:/node配置 jenkins-全局工具配置- …

【Vim编辑器】编码技巧:模板(自动添加信息)+配置参考(~/.vimrc)

前言&#xff1a; 在编写代码时&#xff0c;为了提高代码的可读性和维护性&#xff0c;我们经常在文件的头部添加一些信息提示&#xff0c;如作者、日期、版本号等。本文介绍了如何在 Vim 编辑器中实现自动添加信息提示的功能。 结尾提供~/.vimr参考配置&#xff0c;可提高代码…

短视频seo矩阵+抖音小程序源码开源部署(二)

一、 开发思路&#xff1a; 通过短视频seo矩阵抖音小程序的形式&#xff0c;实现视频的批量制作&#xff0c;小程序内容批量挂载&#xff0c;客户线索批量收集&#xff0c;实现企业运营价值最大化。开发逻辑&#xff1a;通过短视频矩阵布局seo搜索关键词&#xff0c;接入小程序…

Elasticsearch:文档版本控制和乐观并发控制

在今天的文章中&#xff0c;我来详细描述一下 Elasticsearch 文档的版本控制以及如何更新文档。你也可以阅读我之前的文章 “Elasticsearch&#xff1a;深刻理解文档中的 verision 及乐观并发控制”。 版本控制 我们知道 Elasticsearch 的每个文档都有一个相对应的版本。这个版…

GO微服务简介及特性介绍

微服务特性 一、微服务简介-构建单体应用 互联网技术发展迅速的今天&#xff0c;微服务倍受关注&#xff1a;文章、博客、社交媒体讨论和会议演讲都在谈论。与此同时&#xff0c;也有持怀疑态度的软件社区人员认为微服务没什么新鲜可言。反对者声称它的思想只是面向服务架构的…

Windows系统安装JAVA步骤流程(超详细)

超详细的Windows系统安装JAVA步骤流程&#xff0c;Windows操作系统安装java&#xff0c;先下载JDK&#xff0c;然后配置环境变量&#xff0c;阿里云百科分享详细安装流程如下&#xff1a; 目录 Window操作系统安装java流程 下载JDK 配置环境变量 JAVA_HOME 设置 PATH设置…

Centos安装RabbitMQ

#安装 yum install rabbitmq-server #启动 systemctl start rabbitmq-server #查看状态 systemctl status rabbitmg-server #安装管理插件 rabbitmg-plugins enable rabbitmg_management #新增admin账号 rabbitmqctl add_user admin admin #设置为管理员 rabbitmqctl set_user_…

电子电气架构——车载DoIP通信

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此伪装成客观意见,但无一例外的是…

基于FreeRTOS的嵌入式设备管理关键技术研究及实现(学习二)

嵌入式操作系统FreeRTOS FreeRTOS是一个专门为轻量级嵌入式应用设计的迷你操作系统&#xff0c;它的主要功能由IPC、时钟管理、内存管理、任务通知以及任务调度等部分构成。 FreeRTOS的代码可以分解为三个主要区块&#xff1a;任务调度、通讯、硬件库。 任务调度&#xff1a;F…

windows环境安装robotframework-ride

在Windows环境下&#xff0c;可以通过以下步骤安装Robot Framework RIDE&#xff1a; 安装Python 首先&#xff0c;需要在Windows环境下安装Python。建议使用Python 3.x版本&#xff0c;可以从官方网站下载并安装&#xff1a;https://www.python.org/downloads/windows/ 安装w…

shiro登录认证

一&#xff0c;创建数据库 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE user ( uid int(11) NOT NULL AUTO_INCREMENT, uname va…

opencv中Rect()类与rectangle()函数详解

文章目录 Rect()矩形类1、实例化 Rect() 类&#xff1a;&#xff08;1&#xff09;构造函数&#xff1a; 2、Rect类的成员函数&#xff08;1&#xff09;rect.size() 和 rect.area() 和 rect.width() 和 rect.height()&#xff0c;用来描述矩形的宽度&#xff0c;高度&#xff…

SQL专家云回溯某时间段内的阻塞

背景 SQL专家云像“摄像头”一样&#xff0c;对环境、参数配置、服务器性能指标、活动会话、慢语句、磁盘空间、数据库文件、索引、作业、日志等几十个运行指标进行不同频率的实时采集&#xff0c;保存到SQL专家云自己的数据库中。因此可以随时对任何一个时间段进行回溯。 趋势…

基于C++、GDAL、OpenCV的矢量数据骨架线提取算法

基于C、GDAL、OpenCV的矢量数据骨架线提取算法 CGAL已经实现了该功能&#xff0c;但由于CGAL依赖于Boost库&#xff0c;编译后过大&#xff0c;因此本文所采用的这套方式实现骨架线提取功能。 效果&#xff1a; 思路&#xff1a; 1、将导入shp按照要素逐一拆分成新的shp 2、…

java中如何将一个集合list转成以逗号隔开的字符串

事例代码 代码&#xff1a; package com.air.app;import java.util.ArrayList; import java.util.List;public class ListToStringTest {public static void main(String[] args) {//定义list集合List<String> list new ArrayList<>();list.add("1");…

SolidUI AI生成可视化,开创性开源项目,版本0.1.0 功能讲解

文章目录 背景项目名字含义登录页含义产品思维0.1.0 版本内涵功能列表数据源管理项目管理设计页面 背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。Solid…

多元分类预测 | Matlab基于麻雀算法优化深度置信网络(SSA-DBN)的分类预测,多特征输入模型,SSA-DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab基于麻雀算法优化深度置信网络(SSA-DBN)的分类预测,多特征输入模型,SSA-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程…

linux_driver_day03

作业1 题目&#xff1a; 通过ioctl函数选择不同硬件的控制&#xff0c;LED 蜂鸣器 马达 风扇 代码&#xff1a; 代码太多只展示 led 部分&#xff0c;点击查看完整代码 led.c #include "led.h" #include "head.h"static void all_led_init(void);stati…