此时,我们使用双指针算法利用就可以将 O(n*n) 优化为 O(n) 。
用暴力解法一定可解,双重循环得出结果。使用双指针的方法,可以借助一个额外变量,实现降维优化。
关于具体算法应用大家可以看我的快速排序和归并排序,都是非常典型的双指针问题。
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入共两行。
第一行包含整数 n。
第二行包含 n 个整数(均在 0∼1e5 范围内),表示整数序列。
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
1≤n≤100000
5
1 2 2 3 5
3
#include
using namespace std;
const int N = 100010;
int n;
int q[N], s[N];
int main()
{
cin>>n;
for (int i = 0; i < n; i ++ )
{
cin>>q[i];
}
int res = 0;
for (int i = 0, j = 0; i < n; i ++ )
{
s[q[i]] ++ ;
while (j <= i && s[q[i]] > 1)
{
s[q[j]]--;
j++;
}
res = max(res, i - j + 1);
}
cout << res << endl;
system("pause");
return 0;
}
给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。
数组下标从 0 开始。
请你求出满足 A[i] + B[j] = x 的数对 (i,j)。
数据保证有唯一解。
输入共三行。
第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。
第二行包含 n 个整数,表示数组 A。
第三行包含 m 个整数,表示数组 B。
共一行,包含两个整数 i 和 j。
数组长度不超过 1e5。
同一数组内元素各不相同。
1 ≤ 数组元素 ≤ 1e9
4 5 6
1 2 4 7
3 4 6 8 9
1 1
#include
using namespace std;
const int N=100010;
int A[N],B[N];
int n,m,x;
int main()
{
cin>>n>>m>>x;
for(int i=0;i<n;i++)
{
cin>>A[i];
}
for(int j=0;j<m;j++)
{
cin>>B[j];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(A[i]+B[j]==x)
{
cout<<i<<" "<<j<<endl;
}
}
}
system("pause");
return 0;
}
i | j | 判断是否为6 |
---|---|---|
1 | 9 | 大于 |
1 | 8 | 大于 |
1 | 7 | 大于 |
1 | 6 | 大于 |
1 | 4 | 小于 |
2 | 4 | 等于 |
#include
using namespace std;
const int N = 1e5 + 10;
int n, m, x;
int A[N], B[N];
int main()
{
cin>>n>>m>>x;
for (int i = 0; i < n; i ++ )
{
cin>>A[i];
}
for (int i = 0; i < m; i ++ )
{
cin>>B[i];
}
for (int i = 0, j = m - 1; i < n; i ++ )
{
while (j >= 0 && A[i] + B[j] > x)
{
j -- ;
}
if (j >= 0 && A[i] + B[j] == x)
{
cout << i << ' ' << j << endl;
}
}
system("pause");
return 0;
}
给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm。
请你判断 a 序列是否为 b 序列的子序列。
子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。
输入共三行。
第一行包含两个整数 n,m。
第二行包含 n 个整数,表示 a1 , a2 ,…, an。
第三行包含 m 个整数,表示 b1 , b2 ,…, bm 。
如果 a 序列是 b 序列的子序列,输出一行 Yes。
否则,输出 No。
1 ≤ n ≤ m ≤ 1e5
−1e9 ≤ ai , bi ≤ 1e9
3 5
1 3 5
1 2 3 4 5
Yes
#include
using namespace std;
const int N = 100010;
int n, m;
int a[N], b[N];
int main()
{
cin>>n>>m;
for (int i = 0; i < n; i ++ )
{
cin>>a[i];
}
for (int i = 0; i < m; i ++ )
{
cin>>b[i];
}
int i = 0, j = 0;
while (i < n && j < m)
{
if (a[i] == b[j])
{
i ++ ;
}
j ++ ;
}
if (i == n)
{
puts("Yes");
}
else
{
puts("No");
}
system("pause");
return 0;
}