双指针算法。

  相向双指针,指的是在算法的一开始,两根指针分别位于数组/字符串的两端,并相向行走。

  ACWING 的一道裸题(不知道为啥进不去404):最长连续不重复子序列

  输入

  5

  1 2 2 3 5

  输出

  3

    需要两个指针,指针范围为不重复自序列,i,j为其两端。j为左边,i为右边。a【】数组记录原数组,s【】数组记录数字出现次数。怎么搞呢,举个例子,对于样例1 :

  1   2  2  3  5

  0      1       2  3     4

  首先j=0,i=0。。如果当前没有出现某个数的出现次数>1,那么i++,j不变。当 j=0,i=2时,出现了s[2]>1,2出现了2次,很明显不符题意了。那么需要移动指针了。根据常识,我们需要从当前出现两次的数重新开始计了,即 从i=2,j=2开始,我们可以看到,i没变,j移动了,总结:出现次数大于1的数,i不变,j右移,直到i==j。但是既然要重新计,那么记录次数的s[]数组肯定要清一下,所以s[a[j]]--,在j右移的过程中逐步清掉s[]数组,由于出了s[i]==2以外s[j]==1,所以可以把他们都清为s[a[j]]==0,而顺便把重复数s[a[ i ]]==1,重新开始计。

  有点啰嗦了,代码:

  

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1e5;
int a[maxn],s[maxn];
int main()
{
int n;
cin>>n;
for(int i = ;i < n ;i++)
cin>>a[i];
int maxx=- ;
for(int i= ,j=;i< n;i++)
{
s[a[i]]++;
while(s[a[i]]>)
{
s[a[j]]--;
j++;
}
maxx=max(i-j+,maxx);
}
cout<<maxx<<endl;
}

  ACWING800

  给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i] + B[j] = x的数对(i, j)。

     本来写了一个双指针,结果超时了,j每次清0的操作实在花了好多无用功。因为题目中给的两个数组,均为升序排列。所以,用 i  代表a[]数组,j 为b[]数组。j从右往左滑,i往右划。

由于是升序排列,所以j并不需要清成m-1,因为比如:i 在 1位置+j在2位置 ==x,那么下一次 i 右移,j不会再往右移,如果往右移接下来的a+b一定>x,没必要再算了。j不能从左往右滑,不再解释,还是因为升序数组。

  

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1e5+;
int a[maxn],b[maxn];//
int main()
{
int n ,m ,x;
cin>>n>>m>>x;
for(int i= ;i < n ; i++)
cin>>a[i];
for(int i = ;i< m; i++)
cin>>b[i];
int ans=;
for(int i = ,j = m- ; i < n && j>=; i++)
{
while(a[i]+b[j]>x&&j>=)
{
j--;
}
if(a[i]+b[j]==x)
cout<<i<<" "<<j<<endl;
}
}

    位运算 :

    1:  n的二进制表示中第k位是几?  n > > k & 1

    模板:表示N的二进制

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1e5+;
int a[maxn],b[maxn];//
int main()
{
int n;
while(cin>>n)
{
for(int k= ;k>=; k-- )
cout<<(n>>k&);
cout<<endl;
}
}

    2: 返回x(二进制)的最后一位1的位置

    x & (-x)==x & (x取反+1)

    ACWING

    二进制中1的个数

    

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1e5+;
int a[maxn],b[maxn];//
int lowbit(int a)
{
return a&(-a);
}
int main()
{
int n;
cin>>n;
for(int i=;i<=n;i++)
{
int x;
int ans=;
cin>>x;
while(x)
{
ans++;
x-=lowbit(x);  //每次减去x的最后一位
}
cout<<ans<<' ';
}
}

  离散化:整数离散化:

    要点:  1:重复元素的去重。2:如何算离散化值   

  //排序加去重

void quchong()
{
vector<int>alls; //存储所有待离散化的值
sort(alls.begin(),alls.end()); //将所有值排序
alls.erase(unique(alls.begin(),alls.end()),alls.end()); //去掉重复元素
}
//二分法求出x对应的离散化的值
int find(int x) //找到第一个大于等于x的位置
{
int l = , r= alls.size()-;
while(l<r)
{
int mid=(l+r)>>;
if(alls[mid]>=x)
r=mid;
else
l=mid+;
}
return r; //映射
}

  ACWING  区间和

      10^9,不能用前缀和了。分析一下,n+2*m个坐标==3*10^5,用得着的也就这么些坐标了,其他的没必要看,所以可以用离散化来做。

  ACWING 区间合并

  vector的不会做,自己写的代码

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1e5+;
struct node
{
int l,r;
}st[maxn];
bool cmp(node a,node b)
{
return a.l<b.l;
}
int main()
{
int n ;
cin>>n;
for(int i= ; i < n; i++)
{
cin>>st[i].l>>st[i].r;
}
sort(st,st+n,cmp);
int sum = ;
for(int i= ;i < n ;i++)
{
if(st[i].r<st[i+].l)
{
sum++;
// cout<<st[i].l<<" "<<st[i].r<<" -"<<st[i+1].l<<" "<<st[i+1].r<<endl;
}
else
{
if(st[i].r>st[i+].r)
{
st[i+].r=st[i].r;
}
}
}
cout<<sum<<endl;
}

ACWING基础算法(三)的更多相关文章

  1. Java基础算法集50题

    最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...

  2. 贝叶斯公式由浅入深大讲解—AI基础算法入门

    1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定 ...

  3. 贝叶斯公式由浅入深大讲解—AI基础算法入门【转】

    本文转载自:https://www.cnblogs.com/zhoulujun/p/8893393.html 1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生, ...

  4. DAY 4 基础算法

    基础算法 本来今天是要讲枚举暴力还有什么的,没想到老师就说句那种题目就猪国杀,还说只是难打,不是难.... STL(一)set 感觉今天讲了好多,set,单调栈,单调队列,单调栈和单调队列保证了序列的 ...

  5. 【算法】342- JavaScript常用基础算法

    一个算法只是一个把确定的数据结构的输入转化为一个确定的数据结构的输出的function.算法内在的逻辑决定了如何转换. 基础算法 一.排序 1.冒泡排序 //冒泡排序function bubbleSo ...

  6. 分布式共识算法 (三) Raft算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 1.1 介绍 Raft 是一种为了管 ...

  7. 0基础算法基础学算法 第八弹 递归进阶,dfs第一讲

    最近很有一段时间没有更新了,主要是因为我要去参加一个重要的考试----小升初!作为一个武汉的兢兢业业的小学生当然要去试一试我们那里最好的几个学校的考试了,总之因为很多的原因放了好久的鸽子,不过从今天开 ...

  8. Android测试基础题(三)

    今天接着给大家带来的是Android测试基础题(三).    需求:定义一个排序的方法,根据用户传入的double类型数组进行排序,并返回排序后的数组 俗话说的好:温故而知新,可以为师矣 packag ...

  9. PHP基础算法

    1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++ ...

随机推荐

  1. C++Review15_内存管理

    一.野指针 定义指针变量时最好初始化为NULL: 内存回收后,指针也用完了,这时候也需要及时将指针置为NULL: 指针就像野狗一样,为了防止它乱指,除了在使用期间,别的时候都需要置为NULL.这样它就 ...

  2. 第3节 sqoop:7、通过java代码远程连接linux执行shell命令

    数据库的数据同步软件sqoop 数据同步 关系型数据库到大数据平台 任务:sqoop 是批量导入数据太慢,如何做到实时的数据同步 实时的数据同步工具: canal 阿里开源的一个数据库数据实时同步的软 ...

  3. Windows使用Nexus搭建Maven私服

    简介 Maven私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件,有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库,否则,私服请求外部的 ...

  4. dom与jq基础使用

    js有两种运行环境,一个是浏览器,一个是服务器(NodeJS) js的本质是es,因为运行环境的不同,为了操作环境内的api做了升级 在浏览器上js分为es + dom + bom 在服务器上js又有 ...

  5. 剑指offer,双指针法,vector输出不完美

    原因:由于在第一个res push_back给allRes的时候allRes的列已经确定,所以在输出的时候会输出一些多余的东西,在输出的时候不好处理 #include <iostream> ...

  6. [题解] LuoguP5666 树的重心

    这个题......确实是CSPNOIP题qwq 感觉猜到一个性质就差不多了,首先,对于一棵树,随便拎一个节点\(rt\)当根节点,那么他的重心一定在\(rt\)的重儿子里,进一步的,可以发现重心一定在 ...

  7. Vue2.x双向数据绑定

    1.vue双向绑定原理 vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给 ...

  8. IDEA maven 项目报警告解决(自己的maven配置记录)

    IDEA maven 项目报警告解决 应该是JDK版本太低 虽然你装的高但是默认使用maven 默认的 这里要配一下JDK版本 理解不深入只为 自己记录使用 1 配置 仓库为阿里云   配置本地储存j ...

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-asterisk

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. Codeforces 1111C Creative Snap分治+贪心

    Creative Snap C. Creative Snap time limit per test 1 second memory limit per test 256 megabytes inpu ...