基础算法 - 常见算法模板题(最简洁写法)【下】

news2025/1/11 10:17:28

 目录

双指针

         最长连续不重复子序列​编辑

二进制中1的个数

离散化

         区间和

         区间合并


双指针

最长连续不重复子序列

 思路:

  1. 设左右指针 j,i;用 i 遍历数组,对【j,i】范围路径数值出现次数记录
  2. 若次数大于1,则将 j 向前走,直到范围中没有重复数字
  3. 对每一步记录,即比较每个范围的长度,取最大值

#include<iostream>
using namespace std;
int a[100010],s[100010];
int main()
{
    int n,j=0,res=0;
    cin>>n;
    for(int i=0;i<n;i++) 
    {
        cin>>a[i];
        s[a[i]]++;
        while(s[a[i]]>1)
        {
            s[a[j]]--;
            j++;
        }
        res=max(res,i-j+1);
    }
    cout<<res<<endl;
    
    return 0;
}

二进制中1的个数

 思路:

位运算(& | ~ ^ >> <<)_NO.-LL的博客-CSDN博客

利用模板

  while(b)  b=b&(b-1);  //二进制中有多少个1就循环多少次

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+10;

int cnt(int b)
{
    int res=0;
    while(b)
    {
        b=b&(b-1);
        res++;
    }
    return res;
}

int main()
{
    int n,b;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>b;
        cout<<cnt(b)<<" ";
    }
    return 0;
}

离散化

 区间和

思路:

1、设vector<pair<int,int> >  add 用于存储下标x 与要加的值c ,query用于记录要求和的区间【l,r】

2、将下标与区间(x,l,r)都存入alls中,准备离散化

3、对alls排序并去重

 alls.erase(unique(alls.begin(), alls.end()), alls.end());

unique作用:把alls重复元素去除,去除并非删除,只是将重复元素放在数组后面。返回值为去重后序列的最后一个地址(去重元素个数);

erase作用:把后面的元素删除,只留下去重元素

 4、设计find函数查找x,并一一映射到数组a中

5、用前缀和就是区间和

6、通过遍历query,完成求区间[l,r]的和。

 为什么不直接用前缀和呢?

  • 因为数据为-1e9到1e9,没办法开这么大的数组,且x下标存在负值无法存储

总结:

离散化就是将一个大范围离散的数值,聚集(映射)到一个小范围,去重操作是核心

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int, int> PII;

const int N = 300010;

int n, m;
int a[N], s[N];

vector<int> alls;
vector<PII> add, query;

int find(int x)     //找到大于等于x的第一个值
{
    int l = 0, r = alls.size() - 1;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (alls[mid] >= x) r = mid;
        else l = mid + 1;
    }
    return r + 1;    //让下标从1开始,方便前缀和计算
}

/*int find(int x)
{
    return lower_bound(alls.begin(),alls.end(),x)-alls.begin() +1;
}*/

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++ )
    {
        int x, c;
        cin >> x >> c;
        add.push_back({x, c});

        alls.push_back(x);
    }

    for (int i = 0; i < m; i ++ )
    {
        int l, r;
        cin >> l >> r;
        query.push_back({l, r});

        alls.push_back(l);
        alls.push_back(r);
    }

    // 去重
    sort(alls.begin(), alls.end());
    alls.erase(unique(alls.begin(), alls.end()), alls.end());

    // 处理插入
    for (auto item : add)
    {
        int x = find(item.first);
        a[x] += item.second;
    }

    // 预处理前缀和
    for (int i = 1; i <= alls.size(); i ++ ) s[i] = s[i - 1] + a[i];

    // 处理询问
    for (auto item : query)
    {
        int l = find(item.first), r = find(item.second);
        cout << s[r] - s[l - 1] << endl;
    }

    return 0;
}

区间合并

 

思路:

  1. 记录区间左端点st与右端点ed,将区间按左端点排序
  2. 因为左端点有序,只需要判断该区间左端点与前一个区间右端位置,即可确定是否合并
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int, int> PII;

void merge(vector<PII> &segs)
{
    vector<PII> res;

    sort(segs.begin(), segs.end()); //将左边界排序

    int st = -2e9, ed = -2e9;
    for (auto seg : segs)
        if (ed < seg.first) //不重叠,取新区间
        {
            if (st != -2e9) res.push_back({st, ed});    //不是第一次,插入新区间
            st = seg.first, ed = seg.second;
        }
        else ed = max(ed, seg.second);  //有重叠,取交集

    res.push_back({st, ed});    //循环结束,对最后一个区间插入

    segs = res;
}

int main()
{
    int n;
    scanf("%d", &n);

    vector<PII> segs;
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        scanf("%d%d", &l, &r);
        segs.push_back({l, r});
    }

    merge(segs);

    cout << segs.size() << endl;

    return 0;
}

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

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

相关文章

Seata-go 发布 1.0.3,补齐 AT 模式

文&#xff5c;赵新&#xff08;花名&#xff1a;于雨 )蚂蚁集团 Seata 项目开源负责人本文 3902 字 阅读 10 分钟发布概览Seata-go 1.0.3 版本补齐了 AT 模式下对 Insert/Delete 的支持&#xff0c;这意味着除了 “select for update” 外&#xff0c;Seata-go 的 AT 模式与 S…

【c++】 STL的组件简介与容器的使用时机

STL六大组件简介 STL提供了六大组件&#xff0c;彼此之间可以组合套用&#xff0c;这六大组件分别是:容器、算法、迭代器、仿函数、适配器&#xff08;配接器&#xff09;、空间配置器。 容器&#xff1a;各种数据结构&#xff0c;如vector、list、deque、set、map等,用来存放…

ECS概述

1.ECS概述ECS全称Entity-Component-System&#xff08;实体-组件-系统&#xff09;&#xff0c;是基于组合优于继承&#xff08;将不变的部分使用继承以方便复用&#xff0c; 将多变的部分用组合来方便拓展&#xff09;的原则的一种模式&#xff0c;游戏中的每一个单元&#xf…

使用Redis踩过的16个坑

如果你在使用 Redis 时,也遇到过以下这些「诡异」的场景,那很大概率是踩到「坑」了: 明明一个 key 设置了过期时间,怎么变成不过期了? 使用 O(1) 复杂度的 SETBIT 命令,Redis 竟然被 OOM 了? 执行 RANDOMKEY 随机拿出一个 key,竟然也会阻塞 Redis? 同样的命令,为什么…

Linux基础命令学习(Bandit通关)(未完成)

一、前言 Bandit是一个学习Linux的网站&#xff0c;它采用游戏通关的方式来帮助我们学习linux基本使用的命令&#xff0c;十分适合没有基础或基础较弱的同学学习。【虽然是英文但是很容易&#xff0c;用翻译也可】 官网地址是&#xff1a;OverTheWire: Bandit 二、第一~六关…

自从用了这个良心浏览器后,我卸载了UC,太香了

要是以前如果有人问我手机上用什么浏览器好&#xff0c;我肯定一律无脑推荐UC浏览器。一方面它确实功能强大&#xff0c;另一方面是用了很多年已经习惯了&#xff0c;有感情因素在。然而&#xff0c;这次可能要打自己的脸了。 最近&#xff0c;有了个“新欢”&#xff0c;其实…

线程3

一.阻塞队列阻塞队列&#xff0c;也是特殊的队列&#xff0c;虽然也是先进先出的&#xff0c;但是带有特殊功能。阻塞&#xff1a;1.如果队列为空&#xff0c;执行出队列操作&#xff0c;就会阻塞&#xff0c;阻塞到另一个线程往队列中添加元素&#xff08;队列不空为止&#x…

C程序设计笔记(上篇)

笔记正文 第一模块 C基础知识 考试大纲的要求 &#xff08;1&#xff09;掌握数据类型、变量和赋值&#xff1b; &#xff08;2&#xff09;掌握输入和输出&#xff1b; &#xff08;3&#xff09;掌握基本运算符和表达式&#xff1b; &#xff08;4&#xff09;了解简单控制…

米尔国产开发平台T507-H之Android系统发布说明

安卓系统作为目前世界上最受欢迎的移动操作系统&#xff0c;它可以在大量的设备上使用&#xff0c;它正在接管平板电脑、汽车、智能电视、可穿戴设备、家用电器、游戏机等市场&#xff0c;它为嵌入式平台提供了独特而熟悉的体验&#xff0c;从小的手机屏幕到显示器&#xff0c;…

SpringCloud 网关组件 Gateway 原理深度解析

引入网关的必要性 在微服务架构下&#xff0c;我们一般会把相对独立的业务或功能划分为不同的服务&#xff0c;不同服务之间相互隔离&#xff0c;独立部署。这些微服务由服务注册中心集中管理。对于来自外部的用户请求来说&#xff0c;在处理请求的核心业务逻辑之前&#xff0…

Vector - VT System - 模拟输入仿真_VT2004

在我们的测试工作中&#xff0c;经常会遇到一些模拟信号的输入&#xff0c;如果我们使用实际的样件的话一个成本过高&#xff0c;另外一个就是对我们测试人员对环境搭建要求过高&#xff0c;因此最好的办法就是有一个设备能够模拟我们需要的任意信号&#xff0c;这样就能完美的…

Pytorch TextCNN实现中文文本分类(附完整训练代码)

Pytorch TextCNN实现中文文本分类(附完整训练代码) 目录 Pytorch TextCNN实现中文文本分类(附完整训练代码) 一、项目介绍 二、中文文本数据集 &#xff08;1&#xff09;THUCNews文本数据集 &#xff08;2&#xff09; 今日头条文本数据集 &#xff08;3&#xff09;自…

字节跳动青训营笔试题解

文章目录前言一、单选题二、多选题三、编程题T1.旋转数组最大值题目思路代码T2.社交圈题目思路代码四、简答题题目思路前言 第五届字节跳动青训营-后端专场笔试题解&#xff0c;简单做了一下&#xff0c;选择题和简答题不知道是否正确&#xff0c;编程题是通过了的&#xff0c…

基于javaSpringboot+mybatis+layui的装修验收管理系统设计和实现

基于javaSpringbootmybatislayui的装修验收管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文…

创建List保存学生信息

1 问题创建一个存储学生对象的集合&#xff0c;存储3个学生对象&#xff0c;使用程序实现在控制台遍历该集合。2 方法1、定义学生类2、创建List集合对象3、创建学生对象4、将学生添加到集合5、遍历集合创建的学生类代码&#xff1a;package no10;public class Student { …

uni微信小程序,打开地图,跳转第三方

一、需求 微信小程序 需要点击并跳转第三方地图软件导航&#xff0c;并计算到目标位置距离 二、思路 思路&#xff1a; 1.接口返回需要有位置的经纬度&#xff0c;这个自行在后台编辑获取 2.需要获取用户的位置权限 我这边使用的是uniapp&#xff0c;需要使用官方封装两个…

threejs官方demo学习(3):几何体

webgl_geometries 这个案例还是比较简单的&#xff0c;主要介绍了一些创建物体的创建。 知识点 PointLight PointLight 点光源&#xff0c;从一个点向各个方向发出光线的光源&#xff0c;比如灯泡。 BoxGeometry BoxGeometry 立方缓冲几何体 SphereGeometry SphereGeometr…

C 程序设计教程(04)—— C 语言的数据类型(二):构造数据类型

C 程序设计教程&#xff08;04&#xff09;—— C 语言的数据类型&#xff08;二&#xff09;&#xff1a;构造数据类型 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门…

【Go基础】结构体和流程控制语句

文章目录一、结构体1. 结构体创建、访问与修改2. 结构体指针3. 结构体嵌套4. 深拷贝与浅拷贝二、流程控制语句1. if2. switch3. for4. break与continue5. goto与Label一、结构体 1. 结构体创建、访问与修改 定义结构体 type User struct {id intscore float32enrollment tim…

项目实用方式总结

目录 一、后端接收前端请求的方式 1、接收前端传递的单个参数 直接加在url后 通过&#xff1f;拼接 2、接收Json对象 3、一次传递多个数据不使用实例对象的方式 二、vue中使用动态数字 使展示的数字从0动态增长到指定数字 三、在Vue中使用动态数据 四、使用插槽获取表…