题解 | #山寨金闪闪#

山寨金闪闪

https://www.nowcoder.com/practice/9363dcb83ca44c61a2c1a8f65aa722b8

判断的时候可以将片段排序,然后依次判断三个连续数是否满足三角形的构成(两小边之和大于最大边)

如果每次都达到不符合的边界条件(a+b=c),如果以最小计算,从1,1,2开始,后面会构成斐波那契数列,当达到第48项时超出了int的最大值,所以当一个片段长度大于等于47时,则一定存在可构成三角形的三个数。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n= in.nextInt();
        int[] weapon =  new int[n];
        for(int i=0;i<n;i++){
            weapon[i]=in.nextInt();
        }
        int m = in.nextInt();
        int count =0;
        for(int i=0;i<m;i++){
            int l=in.nextInt(),r=in.nextInt();
            if(r-l+1>=47){count++;}//斐波那契数列
            else if(r-l+1<3){continue;}//区间小于3
            else{
                if(triangle(l,r,weapon)){
                count++;
                }
            }
            
        }
	      System.out.println(count);
    }
    public static boolean triangle(int l,int r,int[] weapon){//检测是否能构成
	  //把l到r 片段取出并排序
        int[] temp = new int[r-l+1];
        for(int i=l,j=0;i<=r;i++,j++){temp[j]=weapon[i-1];}
        Arrays.sort(temp);
	  //判断是否构成三角形
        for(int i=0;i<r-l-1;i++){
            if(temp[i]+temp[i+1]>temp[i+2]){
                return true;
            }
        }
        return false;
    }
}

全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务