acwing1210.连号区间数java暴力+正解

 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();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值