双指针算法。

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

  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. ZCGL项目解析——概述

    模块清单 微服务模块:routeservice.eurekaservice.configservice 数据服务模块:fdfsservice.hbaseservice 工具服务模块:common 系统 ...

  2. 侯捷C++学习(一)

    //c++学习//标准库非常重要//要规范自己的代码complex c1(2,1);complex c2;complex* pc = new complex(0,1);string s1(" ...

  3. springCloud 之 Eureka服务治理

    服务治理是微服务架构中最核心和基础的模块 首先我们创建一个springCloud eureka service的springboot 工程,该工程提供一个服务中心,用来注册服务,第二个工程是clien ...

  4. 048、Java中使用switch判断

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. 004.CI4框架CodeIgniter, 配置mysql数据库,并进行数据库查询

    01.在app的Config目录的Database文件里面填写数据库配置,并把pConnect设置成true,此处为一直连接mysql数据库 02.在Models中,创建一个System目录,再在Sy ...

  6. Codeforces 459E Roland and Rose

    本以为是个树形DP,按照树形DP的方法在那里dfs,结果WA到死,因为它存在有向环,不是树,凡是存在环的情况切记不要用树形的方法去做 题目的突破点在于将边排完序之后,用点表示以该点为边结尾的最大长度, ...

  7. 前端性能优化----reflow(回流)和repaint(重绘)

    什么是reflow和repaint(原文链接:http://www.cnblogs.com/Peng2014/p/4687218.html) reflow:例如某个子元素样式发生改变,直接影响到了其父 ...

  8. Javascript获取当前鼠标在元素内的坐标定位

    代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...

  9. ACM-吴奶奶买鱼

    题目描述:吴奶奶买鱼   吴奶奶有个可爱的外孙女——琪琪,她很喜欢小动物,尤其喜欢养鱼.为了让小孙女养到漂亮的小鱼,吴奶奶一大早就到花鸟鱼虫市场买鱼.这个市场可真大,里面有各种各样的宠物,就连宠物鱼都 ...

  10. idea安装Maven Helper

    1. File -> Settings... 2. 选择 Plunins, 查询 Maven Helper,如果没有,点击 Search in repositories 3. 选择 Maven ...