由于每个数都是按照单调递增的序列排列,所以说我们找到的最大值max
和最小值min
的差值恰好为对应的数组下标之差。这样可以确保序列是递增的,即区间里的j-i+1
个数在数组中均填充好。
例如:
数字排列:2、3
数组下标:0、1
固定最初的i为0,a[0]=2
此时的最大值为3,最小值为2。
3-2=1-0=1
即max-min=j-i
j
是我们当前枚举的数字的数组下标,i
是我们最开始固定的数字的数组下标。
这样就可以将连号区间进行统计出来。
再举个例子:
数字排列:2、3、5
数组下标:0、1、2
固定最初的a[i]=2
此时最大值为5
,最小值为2
5-2=3!=2-0=2
此时从2
开始到5
还少了个4
。
无法将该数字序列填充完整。
这便不是连号区间。
不需要再写个for
循环去判断是否是连号区间。
固定a[i]
的位置,只需每次移动多一个a[j]
时。
更新从i~j
的区间内的最大值max
和最小值min
。
再去判断是否满足max-min=j-i
import java.util.*;
public class Main{
static int N=10010;
static int a[]=new int[N];
public static void main(String []args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int res=0;
for(int i=0;i<n;i++)a[i]=sc.nextInt();
for(int i=0;i<n;i++){
int max=-0x3f3f3f3f;
int min=0x3f3f3f3f;
for(int j=i;j<n;j++){
max=Math.max(max,a[j]);
min=Math.min(min,a[j]);
if(max-min==j-i)res++;
}
}
System.out.println(res);
}
}