区间K大数查找 Java 蓝桥杯ALGO-1

Posted 刘辉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间K大数查找 Java 蓝桥杯ALGO-1相关的知识,希望对你有一定的参考价值。

 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6     Scanner aScanner = new Scanner(System.in);
 7     int n= aScanner.nextInt();   //读第一个
 8     long a[] = new long[n];      //存放数组
 9     long b[] = new long[n];      //备用数组
10     
11     for(int i=0;i<n;i++)
12     {
13         a[i] = aScanner.nextInt();
14     }
15     int m = aScanner.nextInt();
16     int []l = new int[1001];
17     int []r = new int[1001];
18     int []k = new int[1001];
19     for(int i=0;i<m;i++)
20     {
21         l[i] = aScanner.nextInt();
22         r[i] = aScanner.nextInt();
23         k[i] = aScanner.nextInt();
24         for(int j=l[i]-1;j<r[i];j++)
25         {
26             b[j-l[i]+1] = a[j];
27         }
28         Arrays.sort(b);
29         System.out.println(b[b.length-k[i]]);
30         Arrays.fill(b, \'\\0\');
31         
32     }
33     }
34 }

  刚开始做的时候使用的二维数组,使用冒泡排序,但涉及到了三层循环,最后虽然结果出来了,但是运行超时。

  于是就需求更优化的方法,后来参考网上的标准答案后有一个排序函数可以用sort()函数,直接使用Arrays.sort()函数对数组进行从小到大的排序,每次得出结果后直接输出。

同时循环一次后需要对结果进行清空,我使用的是Arrays.fill()函数,用‘\\0’来填充,但也有不足的地方,会在清空后都是0的形式存在,数组的长度没有变化,所以需要我之后进一步改进,最后的评测结果如图:仍旧有一个运行超时!!,仅供参考

注:网络查找标准答案代码(Java,未加头文件,自行加入):

public class Main
{
    private static BufferedInputStream in = new BufferedInputStream(System.in);
    public static void main(String[] args) throws IOException {
        int []nums = new int[readint()];
        
        for(int i=0;i<nums.length;i++)
        {
            nums[i] = readint();
        }
        for(int i=readint();i>0;i--)
        {
            int a = readint();
            int b = readint();
            int c = readint();
            
            int[] tn = new int[b-a+1];
            
            for(int j=0;j<tn.length;j++)
            {
                tn[j] = nums[a-1+j];
            }
            Arrays.sort(tn);
            
            System.out.println(tn[tn.length-c]);
        }
    }

    private static int readint()throws IOException {
        // TODO Auto-generated method stub
        int i,sum=0;
        while(((i=in.read())&48)!=48||i>57); 
        
        for(;(i&56)==48||(i&62)==56;i=in.read())
            sum = sum*10+(i&15);
        return sum;
    }
}

 

以上是关于区间K大数查找 Java 蓝桥杯ALGO-1的主要内容,如果未能解决你的问题,请参考以下文章

算法笔记_079:蓝桥杯练习 区间k大数查询(Java)

蓝桥杯--算法训练

K倍区间 -- 蓝桥杯

蓝桥杯 K倍区间 python

2017蓝桥杯 K倍区间 前缀和+同余定理

第八届蓝桥杯-k倍区间