Leetcode - 352周赛详解

news2024/11/20 16:29:32

一,最长奇偶子数组

 看题可知可以使用暴力求解,从头开始遍历数组,另设一个变量来记录满足条件的子数组长度的最大值,将该变量不断与新得到的子数组长度比较,最终得到子数组长度的最大值。但是这样依次遍历的话,时间复杂度为O(n^2)。

设子数组的左下标为 left ,右下标为 right,在上面的解法中,如果一个子数组满足了条件,我们会重复计算[left+1,right]、[left+2,right]....[right,right] 这些子数组长度,因为我们要找到最长,所以这些子数组不用考虑,为了优化这一缺点,我们需要设置一个变量来存储子数组后面的第一个满足1,3条件的初始下标。优化后的时间复杂度为O(n),代码如下:

class Solution {
    public int longestAlternatingSubarray(int[] nums, int threshold) {
        int i = 0;
        int ans = 0;
        while(i < nums.length){
            if(nums[i]>threshold || nums[i]%2 != 0){//筛选子数组的初始下标
                i++;
                continue;
            }
            int j = i;//记录子数组的初始下标
            i++;//避免出现 i+1 使数组下标越界
            //注意:这里没有写nums[i-1]<=threshold的原因是,我们已经在上面比较过了!!!
            while(i < nums.length && nums[i] <= threshold && nums[i]%2 != nums[i-1]%2){
                i++;
            }
            ans = ans > i - j ? ans : i - j;
        }
        return ans;
    }
}

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

 在解决这道题之前,我们需要了解埃式筛,埃式筛是一种得到质数的算法,它的操作是:遍历[2,n]的数,将2的倍数全部删除,下一个遍历的值是3,将3的倍数全部删除,下一个遍历的值是5(因为4已经被删除了),再将5的倍数全部删除,依次类推,最终剩下的就是[2,n]的质数。

埃式筛的核心原理就是:一个质数的因数只有 1 和 它本身!!!所以只要能遍历到,就说明它是质数。

算法实现:

    public final static int MK = (int)1e6+1;//题目要求n 的值在[1,10^6]
    public final static int[] prime = new int[100001];//用来储存质数
    public static final boolean[] is_prime = new boolean[MK];//用来判断下标i是不是质数,false为是质数,true为不是质数
    static{
        int k = 0;
        for(int i=2; i<MK; i++){
            if(!is_prime[i]){
                prime[k++] = i;
                // for(int j=i*i; j <= MK-1; j+=i){
                //   is_prime[j] = true;
                //}
                //上面的写法如果i过大,j会超出int的最大值,从而导致下标越界
                for(int j=i; j <= (MK-1) / i; j++)
                    is_prime[i*j] = true;
            }      
        }
    }

当我们得到[1,n]的质数后,这道题就很简单了,遍历质数数组,将 X 赋值为质数,Y = N - X,如果Y也在质数数组中就说明[X,Y]是符合要求的质数对,将其添加到链表中。结束条件是 X < Y,因为题目要求按照非递减顺序排序。代码如下:

class Solution {
    public final static int MK = (int)1e6+1;
    public final static int[] prime = new int[100001];
    public static final boolean[] is_prime = new boolean[MK];
    static{
        int k = 0;
        for(int i=2; i<MK; i++){
            if(!is_prime[i]){
                prime[k++] = i;
                for(int j=i; j <= (MK-1) / i; j++)
                    is_prime[i*j] = true;
            }      
        }
    }
    public List<List<Integer>> findPrimePairs(int n) {
        List<List<Integer>> ans = new ArrayList();
        if(n%2 != 0){
            if( n>4 && !is_prime[n-2]){
                List<Integer> tmp = new ArrayList();
                tmp.add(2);
                tmp.add(n-2);
                ans.add(tmp);
                return ans;
            }
            return ans;
        }
        for(int i = 0; i < prime.length; i++){
            int x = prime[i];
            int y = n - x;
            if(x > y)break;
            if(!is_prime[y]){
                List<Integer> tmp = new ArrayList();
                tmp.add(x);
                tmp.add(y);
                ans.add(tmp);
            }
        }
        return ans;
    }
}

注意:这里的 if 语句是为了剪枝,不然会超出时间限制,其原理是 奇数A = 奇数B + 偶数C ,且奇数A只能有一个质数对,因为只有2既为偶数,也为质数,所以如果奇数B(即 A-2)是质数,则直接返回[2,n-2],不是质数,就返回空。

三,不间断子数组

题目意思就是nums的不间断子数组要满足   子数组最大值 - 子数组最小值 <= 2

在写这道题之前,我们先举一个例子来理解一下题意,例如:nums = [ 5 , 4 , 2 , 4 ]

 但是这么做的时间复杂度为O(n^2) ,我们还可以优化,实际上当不满足条件时,我们只需要将 L 移动到当前子数组第二大值或者第二小值(第二大/小值离L近就移动到第二大/小值),依次类推,再画个图理解一下:

 

 在理解了这一点后,我们需要做的就是存储 [ L , R ] 的从大到小和从小到大的下标,然后不断的移动L,R就可以了。代码如下:

class Solution {
    public long continuousSubarrays(int[] nums) {
        int[] max = new int[nums.length];//存储子数组的从大到小的下标
        int[] min = new int[nums.length];//存储子数组的从小到大的下标
        int head = 0, headB = 0;
        int last = 0, lastB = 0;
        int L = 0;
        long ans = 0;
        for(int R=0; R<nums.length; R++){
            while(head < last && nums[max[last-1]]<nums[R]){
                last--;
            }
            while(headB < lastB && nums[min[lastB-1]]>nums[R]){
                lastB--;
            }
            a[last++] = R;
            b[lastB++] = R;
            while(head < last && headB < lastB && nums[max[head]]-nums[min[headB]] > 2){
                if(max[head]<min[headB]){
                    head++;
                }else{
                    headB++;
                }
                L = max[head] > min[headB] ? min[headB] : max[head];
            }
            ans += R - L + 1;
        }
        return ans;
    }
}

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

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

相关文章

git 分支管理

目录 一. 理解分支 1. master分支 二. 分支的&#xff08;创建&#xff0c;切换、合并、删除&#xff09; 1.查看分支 2.创建分支 3. 切换分支 4. 合并分支 5. 删除分支 三. 合并冲突 四. 合并模式 五. bug 分支 六. 强制删除分支 一. 理解分支 1. master分支 在我们的…

省电,AMD 提交 Linux 新技术 FreeSync Panel Replay

导读AMD 近日发布了一系列补丁&#xff0c;为其 AMDGPU Linux 内核显卡驱动程序的显示代码 “DC” 添加了一个新功能&#xff1a;FreeSync Panel Replay。这个功能针对搭载 DCN v3.1.4 显示块或更新版本的 AMD Ryzen 笔记本电脑&#xff0c;可以在屏幕内容不变时降低功耗。 目…

关于https的加密流程简介(图解)

目录 对称加密&#xff1a; 非对称加密 对称加密&#xff1a; 在网络发展的初阶&#xff0c;为了保护数据安全&#xff0c;防止黑客攻击&#xff0c;我们发明了对称加密 即一把秘钥&#xff0c;客户端和服务器通过这把钥匙对数据进行加密/解密 理想情况下&#xff0c;只要没…

第163天:应急响应-后门攻击检测指南Rookit内存马权限维持WINLinux

知识点 #知识点 -网页篡改与后门攻击防范应对指南 主要需了解&#xff1a;异常特征&#xff0c;处置流程&#xff0c;分析报告等 主要需了解&#xff1a;日志存储&#xff0c;Webshell检测&#xff0c;分析思路等 掌握&#xff1a; 中间件日志存储&#xff0c;日志格式内容介绍…

Qt之QMainWindow 自定义标题栏

简述 Qt自带标题栏功能还是很强大的&#xff0c;但是确实不能百分百满足需求&#xff0c;除了丑以外还不能随意更改标题栏字体&#xff0c;也不能更改样式&#xff1b;所以为了满足自己的虚荣心让标题栏变得更加好用看好看&#xff0c;特地花时间做了以下测试&#xff1b; 支持…

MySQL:数据的增删改查

数据的增删改查 前言一、插入数据1、实际问题2、方式1&#xff1a;VALUES的方式添加3、方式2&#xff1a;将查询结果插入到表中 二、删除数据三、更新数据四、查询数据五、MySQL8新特性&#xff1a;计算列 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知…

Dubbo sentinel 哨兵 熔断 慢调用比例、异常比例、异常数

目录 熔断报这个错误 在调用程序中检测即可 页面配置熔断&#xff0c;配置在 consumer 消费端 慢调用比例规则 最大rt 比例阈值 熔断时长 最小请求数 统计时长 让流量一直降低发送 异常数量 设置30个异常数 Tps 异常数量未达到30个正常运行 设置1个效果直接连续…

git bash 命令行反应慢、卡顿

1. 在Windows11的电脑上安装了git 后&#xff0c;鼠标右键打开git bash here&#xff0c;打开窗口缓慢&#xff0c;输入命令也慢的要死&#xff0c;如果安装git的时候选择在桌面创建图标&#xff0c;通过桌面图标打开也是一样的 2. 最简单的ls 命令&#xff0c;都要停顿半秒 3.…

Spring Security OAuth2.0(4):Spring Security集成SpringBoot

文章目录 前言一、创建工程二、spring容器配置三、Servlet Context配置四、安全配置五、创建测试七、启动服务器测试 前言 \qquad Spring Boot 是一套Spring的快速开发框架&#xff0c;基于Spring4.0设计&#xff0c;使用Spring Boot开发可以避免一些繁琐的工程搭建和配置&…

d3dx9_43.dll丢失怎么解决

d3dx9_43.dll丢失的影响 当我们在运行某些需要DirectX 9支持的程序时&#xff0c;如果系统中缺少d3dx9_43.dll文件&#xff0c;就会出现错误提示&#xff0c;导致程序无法正常启动。这个错误提示通常会类似于“找不到d3dx9_43.dll”或“d3dx9_43.dll不存在”。 打开电脑浏览器…

剑指 Offer 37: 序列化二叉树

这道题很复杂&#xff0c;首先需要发现是层序遍历&#xff0c;因为只有层序遍历才是这个顺序&#xff0c;并且new就可以调用&#xff0c;说明这里里面就生成了一个新的String&#xff08;可以new一个String&#xff09;&#xff0c;给StringBuilder初始化一个]&#xff0c;然后…

力扣题库刷题笔记31--下一个排列

1、题目如下&#xff1a; 2、个人Python代码实现如下&#xff1a; 前几次提交错误&#xff0c;主要是在上面截图第19行代码&#xff0c;原先写的是Nums nums[:i] temp&#xff0c;然后本地一直能跑过&#xff0c;这里不做多赘述 3、个人Python代码思路&#xff1a; 首先来讲本…

使用springboot框架Java+vue2开发的智慧班牌系统源码,SaaS云平台前后端分离架构

智慧班牌系统可实现数字化办公&#xff0c;对外向学生家长提供各种服务&#xff0c;如&#xff1a;消息通知、请假管理&#xff0c;校园活动&#xff0c;学生动态&#xff0c;教师通讯录&#xff0c;学生定位等各种服务。对内向教师提供各类服务&#xff0c;如&#xff1a;班级…

SpringMVC-1

学习笔记&#xff1a; SpringMVC 框架 Spring Web MVC 是一种基于 Java 实现了 MVC 设计模式的请求驱动型的轻量级 Web 框架&#xff0c;即使用了 MVC 架构模式的思想&#xff0c;将 web 层进行职责解耦&#xff0c;基于请求驱动指的就是使用请求-响应模型&#xff0c;框架的…

[PG]查看数据库大小

查看库大小 select d."oid" as "对象ID", d."datname" as "实例名", d."owner" as "所属者",pg_catalog.pg_size_pretty(d."size") as "大小" from (select oid, datname, pg_catalog.pg_ge…

小程序根据登录的角色动态设置 tabBar

根据登录的状态来展示tabbar的名称 type1 》 供应商 》 合同 送货单 我的 type2 》 监理 》 合同 抽检单 我的 在登录之后就拿到type的值 以及登陆之后跳转到合同页面 在合同页面可以书写逻辑 onShow(){if (Number(uni.getStorageSync("type")) 2) {console.log(11…

mybatis表达式判断引发的问题

在做条件查询的时候&#xff0c; 看似好像没啥问题&#xff0c;但是在查询的时候&#xff0c;检索条件无效&#xff0c;只要把! 去掉就好了&#xff0c; 完美解决。

记录第一次组装电脑遇到的坑

京东装机大师配置清单如下&#xff1a; 主板cpu安装 本次安装拆了两次主板 原因1.主板侧面有个金属板需要从内部安装 2.cpu风扇有个板需要装在主板底下 显卡比较大个要最后装&#xff0c;要不然可能要拆好几次 装系统时候 u盘启动认不出来&#xff0c;他妈的是因为机箱上的usb…

【深度学习】AIGC ,ControlNet 论文,原理,训练,部署,实战,教程(三)

文章目录 源码资源下载Python环境试玩controlnet训练数据准备选一个Stable diffusion模型开始训练 第一篇&#xff1a;https://qq742971636.blog.csdn.net/article/details/131531168 源码资源下载 目前 ControlNet 1.1 还在建设&#xff0c;本文这里使用源码 https://github…

MSP432自主开发笔记2:八路寻迹模块的编程

今日得以继续我的MSP432学习之路&#xff0c;今日学习八路寻迹模块的编程与测试&#xff1a; 本章需要掌握的知识只有俩个&#xff1a;串口通信发送数据、GPIO基础初始化与获取电平状态 这俩个在我专栏里都可寻到&#xff0c;大家可以自行查找~~ 八路灰度寻迹模块的原理与应用…