目录
题目链接
1210. 连号区间数 - AcWing题库
一些话
流程
在 1∼N
的某个排列中有多少个连号区间呢?
求连号区间的个数,
求……个数问题
首先将区间枚举出来,再判断是否连号即可
关于连号区间
正常有序的连号区间比如
1,2,3,4,区间的边界值即区间的最小值与最大值,且差值与左右边界指针相关
由此,判断区间是否连号,首先要将区间的最大值和最小值找出来,判断其差值是否等于左右边界指针差值即可
n<1e5,可以用
for(int i = 0;i < n;i++){
for(int j = i;j < n;j++){
}
}
枚举区间
时间复杂度n*n/2,
套路
单个数组区间的枚举 O(n * n / 2)
for(int i = 0;i < n;i++){
for(int j = i;j < n;j++){
}
}
2.连号区间判断
if(maxn - minn == j - i)
ac代码
// 8:35~8:40思考
// ~52调试
//~59 accepted
//9:01 ~
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 1e4 + 10,INF = 0x3f3f3f3f;
int f[N];
int n;
int main(){
cin >> n;
for(int i = 0;i < n;i++){
scanf("%d",&f[i]);
}
int ans = 0;
for(int i = 0;i < n;i++){
int maxn = -INF,minn = INF;
for(int j = i;j < n;j++){
minn = min(minn,f[j]);
maxn = max(maxn,f[j]);
if(maxn - minn == j - i) ans++;
}
}
cout << ans << endl;
}