ACWING基础算法(三)
双指针算法。
相向双指针,指的是在算法的一开始,两根指针分别位于数组/字符串的两端,并相向行走。
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;
}
给定两个升序排序的有序数组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)
二进制中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基础算法(三)的更多相关文章
- Java基础算法集50题
最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...
- 贝叶斯公式由浅入深大讲解—AI基础算法入门
1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定 ...
- 贝叶斯公式由浅入深大讲解—AI基础算法入门【转】
本文转载自:https://www.cnblogs.com/zhoulujun/p/8893393.html 1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生, ...
- DAY 4 基础算法
基础算法 本来今天是要讲枚举暴力还有什么的,没想到老师就说句那种题目就猪国杀,还说只是难打,不是难.... STL(一)set 感觉今天讲了好多,set,单调栈,单调队列,单调栈和单调队列保证了序列的 ...
- 【算法】342- JavaScript常用基础算法
一个算法只是一个把确定的数据结构的输入转化为一个确定的数据结构的输出的function.算法内在的逻辑决定了如何转换. 基础算法 一.排序 1.冒泡排序 //冒泡排序function bubbleSo ...
- 分布式共识算法 (三) Raft算法
系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 1.1 介绍 Raft 是一种为了管 ...
- 0基础算法基础学算法 第八弹 递归进阶,dfs第一讲
最近很有一段时间没有更新了,主要是因为我要去参加一个重要的考试----小升初!作为一个武汉的兢兢业业的小学生当然要去试一试我们那里最好的几个学校的考试了,总之因为很多的原因放了好久的鸽子,不过从今天开 ...
- Android测试基础题(三)
今天接着给大家带来的是Android测试基础题(三). 需求:定义一个排序的方法,根据用户传入的double类型数组进行排序,并返回排序后的数组 俗话说的好:温故而知新,可以为师矣 packag ...
- PHP基础算法
1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++ ...
随机推荐
- 手动搭建Vue之前奏:搭建webpack项目
手动搭建vue项目 搭建vue前首先搭建webpack项目 首先你应当安装一下npm以及nodejs 安装完成后,进行如下操作: // 创建项目根目录 mkdir some_project_name ...
- 部署 Prometheus Operator【转】
本节在实践时使用的是 Prometheus Operator 版本 v0.14.0.由于项目开发迭代速度很快,部署方法可能会更新,必要时请参考官方文档. 下载最新源码 git clone https: ...
- Java集合基于JDK1.8的ArrayList源码分析
本篇分析ArrayList的源码,在分析之前先跟大家谈一谈数组.数组可能是我们最早接触到的数据结构之一,它是在内存中划分出一块连续的地址空间用来进行元素的存储,由于它直接操作内存,所以数组的性能要比集 ...
- Spring MVC RedirectAttributes取值方法
RedirectAttributes是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的他有两种带参的方式:第一种: attr.addAttribute(" ...
- 面试-PA和XSYX面试小结
XSYX 1.自我介绍 2. 最近一个项目的业务和技术栈 3. 分布式锁解决库存问题 4. spring的IOC和AOP讲解 5. 类加载器层级 6.线程池核心参数和问题 7. 期待的团队是怎样的? ...
- 基于Hadoop3.1.2集群的Hive3.1.2安装(有不少坑)
前置条件: 已经安装好了带有HDFS, MapReduce, Yarn 功能的 Hadoop集群 链接: ubuntu18.04.2 hadoop3.1.2+zookeeper3.5.5高可用完全分布 ...
- Python中语法糖及带参语法糖
在python中,@符号常被称作语法糖(装饰器),在某函数定义时,用以包装该函数,以达到截取,控制该函数的目的. def d(f): print('d...') k=f #此处保留了传进来的原函数 f ...
- Spring 配置Beans
<bean id="UserDao" class="com.jikexueyuan.dao.impl.UserDaoImpl"> <prope ...
- nginx做维护页面
需求: 一个网站本来有好几个域名,然后也有好几个二级域名,现在停掉了,要求把所有的域名.二级域名,以及具体的文件请求,都指向一个维护页面. 1 单独在vhost里建一个conf文件 server { ...
- P1048 数字加密
P1048 数字加密 转跳点: