双指针算法。

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

  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. centos7下yourcompleteme安装

    以前装过一回,没成功,现在再来一次 yourcompleteme git https://github.com/ycm-core/YouCompleteMe#installation 检查软件版本 v ...

  2. no-strings-attached-----攻防世界

    拿到题目到虚拟机里的查看一下 把这些十进制数字转换为16进制,然后利用python deocde 注意0 87这里需要舍弃

  3. PHP-WebShell-Bypass-WAF

    PHP-WebShell-Bypass-WAF PHP WebShell 一句话的结构是:输入和执行,这是经典的PHP 一句话代码: <?php eval($_GET['test']); ?&g ...

  4. python2.7编译安装升级python3并安装Scrapy

    一.安装python3 1.wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz 2.编译安装,在编译安装前需要构建编译环境,安装 ...

  5. java注解——内置注解和四种元注解

    java内置注解: @Override(重写方法):被用于标注方法,用于说明所标注的方法是重写父类的方法 @Deprecated(过时方法):用于说明所标注元素,因存在安全问题或有更好选择而不鼓励使用 ...

  6. 阿里云安装配置nginx

    一.简介 Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.它最常的用途是提供反向代理服务. 二 .安装 1.准备工作 Nginx ...

  7. 使用Vue+JFinal框架搭建前后端分离系统

    前后端分离作为Web开发的一种方式,现在应用越来越广泛.前端一般比较流行Vue.js框架,后端框架比较多,网上有很多Vue+SpringMVC前后端分离的demo,但是Vue+JFinal框架貌似没有 ...

  8. 转 centos7使用kubeadm安装kubernetes 1.12版本

    最近在学习go 模板语法  还是有点小忙 !   感觉写这种 kuberadm 搭建 kubernetes  还是有点水  好吧 可能我太高调了  前前后后搭过四 五次了  ! kuberadm 搭建 ...

  9. DragonFlyBSD 5.6 RC1 发布

    导读DragonFlyBSD操作系统下一个主要版本的第一个候选版本RC1现在可以进行测试.DragonFlyBSD 5.6将成为一个功能更新的版本,该功能更新将于周二晚上发布,是第一个候选版本,同时将 ...

  10. C++面试常见问题——09static关键字

    static关键字 局部变量 局部变量 局部变量是最常见的量,编译器不会对其进行初始化,除非对其显式赋值,不然初始值是随机的. 普通局部变量存储在栈空间,使用完毕后会立即被释放. 静态局部变量 静态局 ...