基础算法-双指针,滑动窗口,位运算,区间离散化

news2024/11/8 20:51:27

双指针

两种类型

 

 

for(int i=0,j=0;i<n;i++)
{
	while(i<j&&check(i,j)) j++;
	// 每道题目具体逻辑
	
}

双指针最核心的性质 可以优化

输入一个字符串 把每个单词输出出来

i找到单词开头

j找到空格

vector<string> rs;
for(int i=0,j=0;i<s.size();i++)
{
		j=i;
		while(j<s.size()&&s[j]!=' ') j+=1;
		rs.push_back(s.substr(i,j-i));
}

最长不重复子串

滑动窗口

i,j指针最多走2n步

int left = 0, right = 0;

while (right < s.size()) {
    // 增大窗口
    window.add(s[right]);
    right++;
    
    while (window needs shrink) {
        // 缩小窗口
        window.remove(s[left]);
        left++;
    }
		默认在这里 r 会落在 第一个不符合的位置
		         l 会落在 区间的第一个数
}

 

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int> pii;

// 题目地址: <https://www.acwing.com/problem/content/804/>
int main()
{
    int n=0;
    int m=0;
    cin>>n>>m;
    vector<pii> add;
    vector<pii> query;
    vector<int> alls;
    for(int i=0;i<n;i++)
    {
        int a=0;
        int b=0;
        cin>>a>>b;
        add.push_back({a,b});
        alls.push_back(a);
    }
    for(int i=0;i<m;i++)
    {
        int a=0;
        int b=0;
        cin>>a>>b;
        query.push_back({a,b});
        alls.push_back(a);
        alls.push_back(b);
    }
    sort(alls.begin(),alls.end());
    alls.erase(unique(alls.begin(),alls.end()),alls.end());
    vector<int> s(alls.size());

    // 左闭右闭
    // 加

    for(int i=0;i<add.size();i++)
    {
        auto item=add[i];
        int k= lower_bound(alls.begin(),alls.end(),item.first)-alls.begin();
        s[k]+=item.second;
    }

    // 前缀和数组 [i,j] 左闭右闭
    for(int i=1;i<s.size();i++) s[i]+=s[i-1];
    for(int i=0;i<m;i++)
    {
        auto item=query[i];
        int k1= lower_bound(alls.begin(),alls.end(),item.first)-alls.begin();
        int k2= lower_bound(alls.begin(),alls.end(),item.second)-alls.begin();
        cout<<s[k2]-((k1>=1)?s[k1-1]:0) <<endl;
    }

}

最小覆盖子串

 

#include<iostream>
#include<vector>
#include<map>
using namespace std;
// 滑动窗口
// <https://leetcode.cn/problems/minimum-window-substring/> 最后一个用例没过  不管了
bool isin(map<char,int> &has,map<char,int> &target)
{
    for(auto item:target)
    {
        if(has.count(item.first))
        {
            if(has[item.first]<item.second)
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    return true;
}
string minWindow(string s, string t) {
    string ans="";
    int l=0,r=0;
    map<char,int> target;
    for(char t1:t)
    {
        if(target.count(t1))
        {
            target[t1]+=1;
        }
        else
        {
            target[t1]=1;
        }
    }

    map<char,int> has;
    while(r<s.size())
    {

        if(has.count(s[r]))
        {
            has[s[r]]+=1;
        }
        else
        {
            has[s[r]]=1;
        }
        r+=1;
        while(l<=r&&isin(has,target))
        {
            if(ans.size()==0||r-l<ans.size())
            {
                ans=s.substr(l,r-l);
            }
            if(has.count(s[l]))
            {
                has[s[l]]-=1;
            }
            l+=1;
        }
        //[l,r) 是要的字符串
    }
    cout<<ans<<endl;
    return ans;
}
int main()
{
    string s;
    cin>>s;
    string t;
    cin>>t;
    minWindow(s,t);
}

位运算

最常用的两个操作

n的二进制 表示中 第k位数是几 从0开始

 

先把第k位移到最后一位

n>>k

然后与1

&1

结合起来

n>>k&1

lowbit(x) 返回x的最后一位1后面的数 比如10100 返回100

负数即为补码 即为取反+1

就可以通过lowbit 求出 一个数中的1的个数

 

不断求它的lowbit即可

#include<iostream>
#include<vector>
using namespace std;

// 1001000  求的 1000
int lowbit(int x)
{
    return x&-x;
}
// 1001000 从0位开始 求k位的数
int k_bit(int x,int k)
{
    return x>>k&1;
}
int main()
{
    int n=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int m=0;
        cin>>m;
        int ans=0;
        while(m)
        {
            m-=lowbit(m);
            ans+=1;
        }
        cout<<ans<<" ";
    }
}

离散化

比如一个区间 它的大小在

 

但我们仅用到了其中的n个数,因此我们可以将它的区间进行映射

如。0 100 300 300000 4000000 500000000

可以映射成

0 1 2 3 4 5

具体代码如下 使用二分搜索

比如 alls中是我们所有赋值与查询用到的数 有
100 0 300 300 300000 40000000 50000000
我们首先排序alls
sort(alls.begin(),alls.end());
并去除重复值
alls.erase(unique(alls.begin(),alls.end()),alls.end());
然后 查询某个 区间[l1,l2]
就可以将l1,l2 映射成 k1,k2
int k1= lower_bound(alls.begin(),alls.end(),l1)-alls.begin();
int k2= lower_bound(alls.begin(),alls.end(),l2)-alls.begin();

 

需要提前知道要有哪些值 查询和用到

如以下这道题

 

 


#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int> pii;

int main()
{
    int n=0;
    int m=0;
    cin>>n>>m;
    vector<pii> add;
    vector<pii> query;
    vector<int> alls;
    for(int i=0;i<n;i++)
    {
        int a=0;
        int b=0;
        cin>>a>>b;
        add.push_back({a,b});
        alls.push_back(a);
    }
    for(int i=0;i<m;i++)
    {
        int a=0;
        int b=0;
        cin>>a>>b;
        query.push_back({a,b});
        alls.push_back(a);
        alls.push_back(b);
    }
    sort(alls.begin(),alls.end());
    alls.erase(unique(alls.begin(),alls.end()),alls.end());
    vector<int> s(alls.size());

    // 左闭右闭
    // 加

    for(int i=0;i<add.size();i++)
    {
        auto item=add[i];
        int k= lower_bound(alls.begin(),alls.end(),item.first)-alls.begin();
        s[k]+=item.second;
    }

    // 前缀和数组 [i,j] 左闭右闭
    for(int i=1;i<s.size();i++) s[i]+=s[i-1];
    for(int i=0;i<m;i++)
    {
        auto item=query[i];
        int k1= lower_bound(alls.begin(),alls.end(),item.first)-alls.begin();
        int k2= lower_bound(alls.begin(),alls.end(),item.second)-alls.begin();
        cout<<s[k2]-((k1>=1)?s[k1-1]:0) <<endl;
    }

}

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

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

相关文章

.Net Forms Resize 12 Crack

.Net Forms Resize 12 Crack 添加了对Microsoft Visual Studio 2022(v17.5.3)及更高版本的支持。 增加了对Microsoft Windows Server 2019和2022的支持。 改进并调整引擎大小(大约快20%)。 更新与受支持的第三方控件的新版本的兼容性。 添加了新的Microsoft Framework 4.8.1库。…

in、not in、between and、基本查询数据库实验三 单表查询(一)(头歌实践教学平台)

文章目的初衷是希望学习笔记分享给更多的伙伴&#xff0c;并无盈利目的&#xff0c;尊重版权&#xff0c;如有侵犯&#xff0c;请官方工作人员联系博主谢谢。 目录 第1关&#xff1a;基本查询语句 任务描述 相关知识 查询数据表中指定字段的内容 查询数据表中的所有内容 …

Ucore lab2

练习一&#xff1a;实现first-fit 连续物理内存分配算法 根据实验指导书中的实验执行流程概述&#xff0c;先了解分析ucore如何对物理内存进行管理&#xff0c;再完成实验练习。 在对物理内存进行管理之前&#xff0c;需要先进行物理内存布局的探测&#xff0c;探测得到的内存…

[LeetCode解题报告] 1157. 子数组中占绝大多数的元素

[LeetCode解题报告] 1157. 子数组中占绝大多数的元素 一、 题目1. 题目描述2. 原题链接二、 解题报告1. 思路分析2. 复杂度分析3. 代码实现三、 本题小结四、 参考链接一、 题目 1. 题目描述 2. 原题链接 链接: 1157. 子数组中占绝大多数的元素 二、 解题报告 1. 思路分析 …

python+requests的接口自动化测试框架实例详解教程

目录 前言 一、环境准备 二、设计框架结构 三、实现框架功能 四、执行测试用例 五、总结 前言 Python是一种简单易学、功能强大的编程语言&#xff0c;广泛应用于各种软件开发和测试场景中。requests是Python中流行的HTTP库&#xff0c;支持发送HTTP请求和处理HTTP响应&a…

【c语言】多维数组原理

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

话说~~ HTTP协议请求的工作流程 (Web服务请求过程)最细详解

目录 文章导入 &#xff1a; 概述 &#xff1a; 详解过程 &#xff1a; DNS域名解析 &#xff1a; DNS 域名解析过程分析 &#xff1a; TCP连接搭建 &#xff1a; 等待TCP队列 建立TCP连接 发起 HTTP 请求 &#xff1a; # 哪是如何进行 HTTP 请求的呢 &#…

实验架构的部署

目录 实验要求 实验环境 1、部署静态页面 2、部署负载均衡 3、搭建动态网页 4、 nginx反向代理 5、部署NFS 7、mysql 安装mysql 安装mha 准备主从复制 开启mha 架构的部署 实验要求 完成用户访问时虚拟IP由LVS负责高可用&#xff0c;静态交给nginx处理&#xff0c;…

【工具篇】Spring Boot 整合阿里云短信-SMS

短信服务-SMS 短信服务&#xff08;Short Message Service&#xff09;是广大企业客户快速触达手机用户所优选使用的通信能力&#xff0c;分为国内短信服务和国际/港澳台短信服务。通过 API/SDK、控制台调用短信发送能力&#xff0c;将指定信息发送至国内或境外手机号码。 应…

<数据结构>NO1.算法的时空复杂度

文章目录&#x1f6a9;算法效率算法复杂度&#x1fa85;时间复杂度大O的渐进表示法常见的时间复杂度举例&#x1fa85;空间复杂度大O的渐进表示法常见的空间复杂度举例&#x1f5ef;️常见复杂度对比&#x1f5ef;️&#x1f6a9;算法效率 算法是一个被设计好的&#xff0c;计…

python 读写txt方法

​​​​​​​ 1. Python支持在程序中读写 txt文件。这里有两种方式&#xff1a; 方式一&#xff1a;使用 python内置函数&#xff0c;该函数将一个字符串的长度转换为与这个字符串长度相关的值。 例如&#xff1a;" readme"&#xff08;"r&#xff09;。 prin…

数据结构---递归转化为非递归

递归转化为非递归前言快速排序非递归归并排序的非递归前言 为什么要学习非递归写法呢&#xff1f; 当我们在用递归实现一个程序的时候&#xff0c;要考虑一个问题&#xff0c;这个程序用递归去实现&#xff0c;当数据量庞大的时候&#xff0c;会不会造成栈溢出(STACK OVERFLOW…

学习风`宇blog的websocket模块

文章目录后端代码引入依赖WebSocketConfigWebSocketServiceImpl分析tb_chat_record表WebSocketServiceImplChatConfigurator聊天消息ChatTypeEnumsWebsocketMessageDTO后端 代码 引入依赖 仅需引入以下依赖 <!-- websocket依赖 --> <dependency><groupId>…

ACM8629 立体声50W/100W单声道I2S数字输入D类音频功放IC

概述 ACM8629 一款高度集成、高效率的双通道数字输入功放。供电电压范围在4.5V-26.4V,数字接口电源支持3.3V 。在4 欧负载&#xff0c;BTL模式下输出功率可以到250W1%THDN&#xff0c;在2欧负载&#xff0c;PBTL模式下单通道可以输出1100W 1%THDN. ACM8629采用新型PWM脉宽调制架…

全国青少年软件编程(Scratch)等级考试二级考试真题2023年3月——持续更新.....

一、单选题(共25题,共50分) 1. 小猫的程序如图所示,积木块的颜色与球的颜色一致。点击绿旗执行程序后,下列说法正确的是?( ) A.小猫一直在左右移动,嘴里一直说着“抓到了”。 B.小猫会碰到球,然后停止。 C.小猫一直在左右移动,嘴里一直说着“别跑” D.小猫会碰到球,…

2023MatherCup杯三人小队手搓!(C 题 电商物流网络包裹应急调运与结构优化问题)

一个不知名大学生&#xff0c;江湖人称菜狗original author: Jacky LiEmail : 3435673055qq.com Time of completion&#xff1a;2023.4.16 Last edited: 2023.4.16 实际完成时间&#xff1a;2023/4/17 0:52 Mathematical modeling Author: HandSome Wang、BigTall Hu、Jacky L…

一个Email简单高效处理.Net开源库

推荐一个可处理电子邮件消息开源库&#xff0c;可用于消息解析、消息创建、消息修改和消息发送等功能。 项目简介 这是一个基于C#开发的&#xff0c;针对MIME&#xff08;多用途邮件扩展&#xff09;消息创建与解析&#xff0c;该项目简单易用、可用于消息解析、消息创建、消…

【Pytorch】神经网络搭建

在之前我们学习了如何用Pytorch去导入我们的数据和数据集&#xff0c;并且对数据进行预处理。接下来我们就需要学习如何利用Pytorch去构建我们的神经网络了。 目录 基本网络框架Module搭建 卷积层 从conv2d方法了解原理 从Conv2d方法了解使用 池化层 填充层 非线性层 …

Node实现 Socket 通信

socket 通信流程 Socket通信&#xff0c;首先要知道 Socket 是什么&#xff0c;就是网络上的两个程序通过一个双向的通信连接实现数据的交换&#xff0c;这个连接的一端被称为 socket &#xff0c;举一个简单的例子就是两个人在线上进行聊天&#xff0c;即线上通信&#xff0c…

充电桩检测设备TK4860E交流充电桩检定装置

产品特点 充电桩检测设备内置5.28 kW单相交流负载&#xff0c;无需携带额外负载进行测试。 宽动态范围测量技术&#xff0c;避免充电桩输出波动引起的测量风险。 ms级电能刷新速度&#xff0c;减少充电桩与标准仪器在非同步累积电能过程中引入的误差&#xff0c;提高累积电能…