【蓝桥杯集训4】双指针专题(6 / 6)

news2024/11/16 12:30:56

目录

3768. 字符串删减 - 滑动窗口ac

799. 最长连续不重复子序列 - 滑动窗口

800. 数组元素的目标和 - 二分ac

2816. 判断子序列 - 双指针

1238. 日志统计 - 滑动窗口

1240. 完全二叉树的权值 - 双指针  

1、前缀和 - 通过了 5/12个数据 

2、双指针


3768. 字符串删减 - 滑动窗口ac

3768. 字符串删减 - AcWing题库

题目:

思路:

用双指针l和r,移动r指针

当已经统计了2个x,若下一个字符为x,则需要删除1个x,且滑窗左边界往后移一位

若下一个字符不为x,则统计x个数的cnt清零,缩小滑窗至该非x字符上

import java.util.*;

class Main
{
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        String s=sc.next();
        int res=0,cnt=0;
        for(int l=0,r=0;r<n;r++)
        {
            char c=s.charAt(r);
            if(cnt==2&&c=='x')
            {
                res++;
                l++;
            }
            else if(c=='x') cnt++;
            else 
            {
                cnt=0;
                l=r;
            }
        }
        System.out.print(res);
    }
}

799. 最长连续不重复子序列 - 滑动窗口

活动 - AcWing

题目:

给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

输入样例:
5
1 2 2 3 5
输出样例:
3

思路:

用一个数组统计每个数字出现个数

滑动窗口中如果出现重复数字,则左边界增大缩小滑窗直至不出现重复数字

不断更新最大连续不重复子序列长度

import java.util.*;

class Main
{
    static int N=100010;
    static int[] st=new int[N];
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] a=new int[n];
        for(int i=0;i<n;i++) a[i]=sc.nextInt();
        
        int res=0;
        for(int l=0,r=0;r<n;r++)
        {
            st[a[r]]++;
            while(l<r&&st[a[r]]>1) st[a[l++]]--; //如果滑窗内仍存在重复数字 则缩小滑窗
            res=Math.max(res,r-l+1);
        }
        System.out.print(res);
    }
}

 

800. 数组元素的目标和 - 二分ac

活动 - AcWing

import java.util.*;

class Main
{
    static int N=100010;
    static int[] a=new int[N],b=new int[N];
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt(),x=sc.nextInt();
        for(int i=0;i<n;i++) a[i]=sc.nextInt();
        for(int j=0;j<m;j++) b[j]=sc.nextInt();
        
        
        for(int i=0;i<n;i++)
        {
            int t=x-a[i];
            int l=0,r=m-1;
            while(l<r)
            {
                int mid=l+r>>1;
                if(b[mid]>=t) r=mid;
                else l=mid+1;
            }
            if(b[l]==t)
            {
                System.out.print(i+" "+l);
                break;
            }
        }
    }
}

 

2816. 判断子序列 - 双指针

活动 - AcWing

题目:

思路:

用i指针指向a,j指针指向b

遍历b数组,如果a[i]==b[j],则向后移动i指针

如果遍历完,i==n,说明a全部匹配成功,说明a是b的子序列

import java.util.*;

class Main
{
    static int N=100010;
    static int[] a=new int[N],b=new int[N];
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=0;i<n;i++) a[i]=sc.nextInt();
        for(int j=0;j<m;j++) b[j]=sc.nextInt();
        
        int i=0;
        for(int j=0;j<m;j++)
        {
            if(i<n&&a[i]==b[j]) i++;
        }
        if(i==n) System.out.print("Yes");
        else System.out.print("No");
    }
}

 

1238. 日志统计 - 滑动窗口

活动 - AcWing

题目:

思路:

按时间从小到大顺序排序

枚举时间段,滑动窗口内为合法时间,记录该区间内帖子的赞数

如果在滑窗内且赞数≥k,则为热帖,标记上

import java.util.*;

class Main
{
    static int N=100010;
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),d=sc.nextInt(),k=sc.nextInt();
        int[][] list=new int[n][2];
        int[] cnt=new int[N];
        int[] st=new int[N];
        for(int i=0;i<n;i++)
        {
            list[i][0]=sc.nextInt();
            list[i][1]=sc.nextInt();
        }
        Arrays.sort(list,(o1,o2)->{return o1[0]-o2[0];});
        
        for(int l=0,r=0;r<n;r++) //滑动窗口是合法时间段 统计滑窗内是否有热帖存在
        {
            int id=list[r][1];
            cnt[id]++;
            
            while(list[r][0]-list[l][0]>=d) //超过最大时间段 缩小滑窗
            {
                cnt[list[l][1]]--;
                l++;
            }
            
            if(cnt[id]>=k) st[id]=1;
        }
        for(int i=0;i<=100000;i++) if(st[i]==1) System.out.println(i);
    }
}

 

1240. 完全二叉树的权值 - 双指针  

活动 - AcWing

题目:

1、前缀和 - 通过了 5/12个数据 

看错题了,概念问题,是完全二叉树,看成满完全二叉树了……

完全二叉树,共n层,其中n-1层是满二叉树结构,最后一层所有节点都在最左边

import java.util.*;

class Main
{
    static int N=100010;
    
    public static int work(int n)
    {
        int cnt=0;
        while(n>1)
        {
            n/=2;
            cnt++;
        }
        return cnt;
    }
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] a=new int[N];
        int[] s=new int[N];
        for(int i=1;i<=n;i++) 
        {
            a[i]=sc.nextInt();
            s[i]=s[i-1]+a[i];
        }
        int t=work(n+1);
        t--;
        int cnt=1,pre=1;
        int maxx=s[1],res=1;
        while(t-->0)
        {
            int r=(int)Math.pow(2,cnt);
            int sum=s[r]-s[pre];
            if(maxx<sum)
            {
                maxx=sum;
                int tp=work(r+1);
                res=tp;
            }
            cnt++;
            pre=r;
        }
        System.out.print(res);
        
    }
}

2、双指针

思路:

枚举每一层的起点和层数

计算每一层的总和 取最大值

import java.util.*;

class Main
{
    static int N=100010;
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] a=new int[N];
        for(int i=1;i<=n;i++) a[i]=sc.nextInt();
        
        long maxx=-0x3f3f3f3f;
        int res=0;
        for(int i=1,d=1;i<=n;i*=2,d++) //i为起点下标 d为层数
        {
            long sum=0;
            for(int j=i;j<i+(1<<d-1)&&j<=n;j++) sum+=a[j]; //1<<d指将1位二进制数向左移d位 即2^d
            
            if(sum>maxx)
            {
                maxx=sum;
                res=d;
            }
        }
        System.out.print(res);
    }
}

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

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

相关文章

<<Java开发环境配置>>6-SQLyog安装教程

一.SQLyog简介: SQLyog 是一个快速而简洁的图形化管理MySQL数据库的工具&#xff0c;它能够在任何地点有效地管理你的数据库&#xff0c;由业界著名的Webyog公司出品。使用SQLyog可以快速直观地让您从世界的任何角落通过网络来维护远端的MySQL数据库。 二.SQLyog下载: 下载地址…

mySQL服务主从实现

一主一从1.1 环境准备&#xff1a;centos系统服务器2台、 一台用户做Mysql主服务器&#xff0c; 一台用于做Mysql从服务器&#xff0c; 配置好yum源、 防火墙关闭、 各节点时钟服务同步、 各节点之间可以通过主机名互相通信1.2 准备步骤&#xff1a;1&#xff09;iptables -F &…

多态和可变参数

多态 多态是同一个行为具有不同的表现形式或者形态的能力 &#x1f47f;多态的作用:主要用来实现动态性,提高程序的灵活性和扩展性 &#x1f916;故事:大宝-小宝是父子,有一天小宝接到打给大宝的电话,让大宝去喝喜酒,但是大宝不在家,小宝急中生智想到假扮成大宝去参加喜宴,这个…

Unity法线贴图原理理解(为什么存在切线空间?存的值是什么?)

Unity法线贴图原理理解(为什么存在切线空间&#xff1f;存的值是什么&#xff1f;&#xff09;写在前面1、为什么用法线贴图&#xff1f;2、用什么存法线&#xff1f;3、法线向量为什么存在切线空间&#xff1f;法线贴图存得是什么&#xff1f;4、法线贴图为什么会偏蓝&#xf…

MySQL字段值如何区分大小写

MySQL字段值如何区分大小写 注意&#xff1a;设置的是字段值区分大小写 1. 查询时指定大小写敏感&#xff0c;加关键字‘BINARY’ &#xff08;1&#xff09;删表&#xff0c;建表&#xff0c;新增数据 drop table binary_test; CREATE TABLE binary_test (id INT unsigned P…

2023年浙江建筑施工物料提升(建筑特种作业)模拟试题及答案

百分百题库提供特种工&#xff08;物料提升机&#xff09;考试试题、特种工&#xff08;物料提升机&#xff09;考试预测题、特种工&#xff08;物料提升机&#xff09;考试真题、特种工&#xff08;物料提升机&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考…

Zebec完成BNB Chain以及Near链上协议部署,多链化进程加速

从去年开始&#xff0c;Zebec 就开始以多链的形式来拓展自身的流支付生态&#xff0c;一方面向更多的区块链系统拓展自身流支付协议&#xff0c;即从Solana上向EVM链上对协议与通证等进行迁移与拓展。目前基本完成了在BNB Chain以及Near上的合约部署&#xff0c;且能够在这些EV…

handler解析(4)-Message及Message回收机制

Message中可以携带的信息 Message中可以携带的数据比较丰富&#xff0c;下面对一些常用的数据进行了分析。 /*** 用户定义的消息代码&#xff0c;以便当接受到消息是关于什么的。其中每个Hanler都有自己的命名控件&#xff0c;不用担心会冲突*/ public int what; /*** 如果你…

Mrkdown相关快捷键

Mrkdown相关快捷键欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚…

ChatGPT持续“狂飙“,有这么人工智能吗?

最近&#xff0c;一款新聊天工具ChatGPT火了&#xff0c;可以聊天、写作、编程、翻译&#xff0c;甚至可以质疑和拒绝你的要求。自2022年11月底推出以来&#xff0c;ChatGPT已经成为历史上增长最快的消费者应用程序之一。ChatGPT的狂飙突进引来谷歌、百度等众多互联网巨头的跟进…

案例分享 | 某券商利用AI技术进行告警关联分析(下)

本内容来自公众号“布博士”------&#xff08;擎创科技资深产品专家&#xff09;在上期内容中&#xff0c;我们了解到跨行业数据挖掘标准流程包括6大过程&#xff0c;分别为业务理解&#xff08;Business Understanding&#xff09;、数据理解&#xff08;Data Understanding&…

JavaWeb3-线程的3种创建方式7种写法

目录 1.方式一&#xff1a;继承Thread&#xff08;2种写法&#xff09; 写法①&#xff08;常规&#xff09;&#xff1a; a.使用jconsole观察线程 b.启动线程——start方法 PS&#xff1a;&#xff08;常见面试题&#xff09;start 方法与 run 方法的区别&#xff1a; 写…

免费CRM客户管理系统真的存在吗?不仅有,还有5个!

免费CRM客户管理系统真的存在吗&#xff1f;当然有&#xff01; 说到CRM客户管理系统&#xff0c;相信很多企业并不陌生&#xff0c;是因为CRM客户管理系统已经成为大多数企业最不可或缺的工具。但是对于很多小微企业和个人用户来说&#xff0c;购买和实施CRM的成本仍然难以承…

上海亚商投顾:沪指午后放量跳水两市上涨个股不足500只

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪指数早间震荡走高&#xff0c;沪指盘中收复3300点&#xff0c;午后集体跳水&#xff0c;创业板指一度跌超2%。ChatGP…

Spring 系列之 MVC

Spring 系列文章目录 文章目录Spring 系列文章目录前言一、介绍二、项目搭建1.创建空项目2.设置maven和lombok3.创建maven web module4. 配置Tomcat启动运行项目&#xff08;选择local本地&#xff09;5. 导入jar依赖包6.在web.xml中配置DispatcherServlet7. 加入SpringMVC的配…

第六章——抽样分布

文章目录1、统计量的定义2、常用的统计量3、经验分布函数4、正态总体常用统计量的分布4.1、卡方分布4.1.1、卡方分布的定义4.1.2、卡方分布的性质4.2、t分布4.2.1、t分布的定义4.2.2、t分布的性质4.3、F分布4.3.1、F分布的定义4.3.2、F分布的性质5、正态总体的样本均值与样本方…

Hexo搭建个人博客流程全记录

建站缘由 有些东西过不了审&#xff0c;不方便给他人查看&#xff0c;于是就利用Hexo框架搭建了一个个人博客&#xff0c;部署在Github上&#xff0c;取名为“zstar的安全屋”。 链接&#xff1a;http://xdxsb.top 安装Git Bash 无需多言&#xff0c;下载链接&#xff1a;ht…

全网招募P图高手!阿里巴巴持续训练鉴假AI

P过的证件如何鉴定为真&#xff1f;三千万网友都晒出了与梅西的合影&#xff1f;图像编辑技术的普及让人人都能P图&#xff0c;但也带来“假图”识别难题&#xff0c;甚至是欺诈问题。 为此&#xff0c;阿里安全联合华中科技大学国家防伪工程中心、国际文档分析识别方向的唯一顶…

【集合】JAVA基础篇(二)

【集合】JAVA基础篇&#xff08;二&#xff09;一、java常用集合1、Java集合接口的作用2、Java集合常用实现类的作用二、Collection 常用的方法三、List 集合接口1、ArrayList类的常用方法2、LinkList类中的方法3、Vector4、ArrayList 类和 LinkedList 类的区别四、Set 集合1、…

图解LeetCode——剑指 Offer 27. 二叉树的镜像

一、题目 请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像&#xff0c;返回镜像后的根节点TreeNode。 二、示例 2.1> 示例 1&#xff1a; 【输入】root [4,2,7,1,3,6,9] 【输出】[4,7,2,9,6,3,1] 限制&#xff1a; 0 < 节点个数 < 1000 …