【题目描述】
TLE 代码:
O(N ^ 3)
import java.io.*;
public class Main{
static int N = 10010;
static int f[] = new int[N];
//注意 : N 个不同的数字 Pi,
//所以如果是连号区间则:最小值与最大值之差与 区间长度 - 1 相等
public static boolean check(int p, int q){
int a = 10010, b = 0;
for(int i = p; i <= q; i ++){
a = Math.min(a, f[i]);
b = Math.max(b, f[i]);
}
return (b - a) == (q - p);
}
public static void main(String args[]) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
String s[] = bf.readLine().split(" ");
//1≤Pi≤n
for(int i = 0; i < n; i ++) f[i] = Integer.parseInt(s[i]);
//区间 [j, i](j < i)
//3 2 4 1 [0,1]
int ans = 0;
for(int i = 0; i < n; i ++)
for(int j = 0; j < i; j ++){
//判断[j,i]区间是否为连号区间
if(check(j, i)) ans++;
}
System.out.println(ans + n );
}
}
【思路】
i枚举区间左端点 j枚举区间右端点 j向右扩展 同时更新( [i,j]区间)最小/大值。
注意 :第二行输入是N 个不同的数字 Pi,所以如果是连号区间则:最小值与最大值之差与 区间长度 - 1 相等
import java.io.*;
public class Main{
static int N = 10010;
static int f[] = new int[N];
public static void main(String args[]) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
String s[] = bf.readLine().split(" ");
//1≤Pi≤n
for(int i = 0; i < n; i ++) f[i] = Integer.parseInt(s[i]);
//注意 : N 个不同的数字 Pi,
//所以如果是连号区间则:最小值与最大值之差与 区间长度 - 1 相等
int ans = 0;
for(int i = 0; i < n; i ++){
int a = 10010, b = 0;
for(int j = i; j < n; j ++){
//判断[j,i]区间是否为连号区间
a = Math.min(a, f[j]);
b = Math.max(b, f[j]);
if( b - a == j - i) ans ++;
}
}
System.out.println(ans);
}
}