1.这道题暴力法的基本思想是两个for循环嵌套,外层for循环i=0,内层for循环j=i,相当于不断遍历所有区间,每遍历一个区间,定义一个boolean方法进行判断这个区间是否符合题干条件,返回true就count++。但这个解法只适合oi赛制中拿部分分,在acwing平台上不会通过全部测试数据。
import java.util.Arrays;
import java.util.Scanner;
public class acwing1210连号区间数暴力 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
int count=0;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(isConsecutive(arr,i,j)){
count++;
}
}
}
System.out.println(count);
sc.close();
}
public static boolean isConsecutive(int[] arr, int i, int j) {
int[] subArray = Arrays.copyOfRange(arr, i, j + 1);
Arrays.sort(subArray);
for (int k = 0; k < subArray.length-1; k++) {
if (subArray[k + 1] != subArray[k] + 1) {
return false;
}
}
return true;
}
}
2.优化后的正解:yxc讲的这道题,就是先定义一个max=一个极小值和min=一个极大值,区间不断扩张,每进来一个数就进行比较,如果最大值减去最小值等于两个j i索引之差,就说明这是一个连号区间,count++。
import java.util.Arrays;
import java.util.Scanner;
import static java.lang.Math.min;
import static java.lang.Math.max;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
int count=0;
for(int i=0;i<n;i++){//枚举区间左端点
int max=-1000000;//极大值
int min=1000000;//极小值
for(int j=i;j<n;j++){//
min=min(min,arr[j]);
max=max(max,arr[j]);
if(max-min==j-i){//观察到极大值与极小值之间的差等于j-i
count++;
}
}
}
System.out.println(count);
sc.close();
}
}