算法分析
-
1、固定
L
,遍历R
-
2、在
[L,R]
区域中找到最大值Max
,最小值Min
,若maxv - minv == j - i
,则说明该区域[L,R]是递增且连续的
时间复杂度 $O(n^2)$
参考文献
算法提高课
Java 代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N = 10010;
static int[] f = new int[N];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine().trim());
String[] s1 = reader.readLine().split(" ");
for(int i = 1;i <= n;i++) f[i] = Integer.parseInt(s1[i - 1]);
int res = 0;
for(int i = 1;i <= n;i++)
{
int minv = Integer.MAX_VALUE;
int maxv = Integer.MIN_VALUE;
for(int j = i;j <= n;j++)
{
minv = Math.min(minv, f[j]);
maxv = Math.max(maxv, f[j]);
if(maxv - minv == j - i) res ++;
}
}
System.out.println(res);
}
}
为什么[2,3]不行呢?大佬
因为[2,4]并不是连续的
一开始看了感觉有些误解,样例中[2,3]的元素为2、4,2、4并不是连续的
大佬tql
n方?数据范围是10000啊 不会超时??
这里运行的次数是刚好在
10^8
次附近,并且由于每次j
从i
开始,因此总的运行次数n + (n - 1) + ... + 1 = (1 + n) * n / 2 = 1000 * 1000 / 2 = 5 * 10 ^ 7 < 10^8
,所有不超时